diff --git a/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml b/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml index 64a53ce50..1d2000275 100644 --- a/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml +++ b/.devcontainer/docker-compose.devcontainer.sqlite-tika.yml @@ -66,7 +66,7 @@ services: command: - "gotenberg" - "--chromium-disable-javascript=true" - - "--chromium-allow-list=file:///tmp/.*" + - "--chromium-allow-list=^file:///tmp/.*" tika: image: docker.io/apache/tika:3.3.1.0 restart: unless-stopped diff --git a/.dockerignore b/.dockerignore index b9c7d2f84..d378a026a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,6 +15,8 @@ # Test related **/.pytest_cache **/tests +src/paperless_testing +src/conftest.py **/*.spec.ts **/htmlcov # Local folders diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 615e91bad..c12b45949 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -31,9 +31,19 @@ body: value: | #### 🤖 Use of AI tools - If this report was generated, in whole or in part, by an AI tool or agent you **must** clearly say so in the description below. Failing to clearly disclose this is a violation of our [Code of Conduct](https://github.com/paperless-ngx/paperless-ngx/blob/main/CODE_OF_CONDUCT.md). + If this report was generated, in whole or in part, by an AI tool or agent you **must** say so using the field below. Failing to clearly disclose this is a violation of our [Code of Conduct](https://github.com/paperless-ngx/paperless-ngx/blob/main/CODE_OF_CONDUCT.md). Reports written by an AI agent must describe the _observed behavior only_: what happened, how to reproduce it, logs etc. Do **not** include code analysis, speculation about the root cause, or suggest code fixes. + - type: dropdown + id: ai-usage + attributes: + label: AI usage + description: Was any part of this report written by an AI tool or agent? + options: + - No AI tools were used + - Yes, AI tools helped write this report + validations: + required: true - type: textarea id: description attributes: diff --git a/.github/actions/apt-install/action.yml b/.github/actions/apt-install/action.yml new file mode 100644 index 000000000..3f20230e6 --- /dev/null +++ b/.github/actions/apt-install/action.yml @@ -0,0 +1,53 @@ +name: Install apt packages +description: > + Installs apt packages with a per-attempt timeout and retries. The hosted runner's Azure apt mirror intermittently serves archives at a crawl, which apt's own timeout does not catch. A stuck attempt is killed and retried, which usually lands on a healthy mirror node. + +inputs: + packages: + description: Space separated list of packages to install + required: true + attempts: + description: Maximum number of attempts + default: "3" + attempt-timeout: + description: Seconds before a single attempt is killed + default: "180" +runs: + using: composite + steps: + - name: Install ${{ inputs.packages }} + shell: bash + env: + PACKAGES: ${{ inputs.packages }} + ATTEMPTS: ${{ inputs.attempts }} + ATTEMPT_TIMEOUT: ${{ inputs.attempt-timeout }} + run: | + SUDO="" + if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" + fi + + attempt_install() { + $SUDO apt-get update -q + # Intentionally unquoted, this is a list of package names + $SUDO apt-get install -q --yes --no-install-recommends $PACKAGES + } + export -f attempt_install + export SUDO PACKAGES + + for attempt in $(seq 1 "${ATTEMPTS}"); do + echo "::group::apt install attempt ${attempt}/${ATTEMPTS}" + start=$(date +%s) + if timeout --kill-after=10 "${ATTEMPT_TIMEOUT}" bash -c attempt_install; then + echo "::endgroup::" + echo "Installed in $(( $(date +%s) - start ))s" + exit 0 + fi + echo "::endgroup::" + echo "::warning::apt install attempt ${attempt}/${ATTEMPTS} failed or exceeded ${ATTEMPT_TIMEOUT}s" + # A killed attempt can leave dpkg half configured + $SUDO dpkg --configure -a || true + done + + echo "::error::apt install failed after ${ATTEMPTS} attempts" + exit 1 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8f5ed1cb6..2db7234bb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -59,7 +59,6 @@ updates: - "drf-*" - "djangorestframework" - "whitenoise" - - "bleach" - "jinja2" # Async, Task Queuing & Caching async-tasks: @@ -81,7 +80,6 @@ updates: # Data, NLP, and Search data-nlp-search: patterns: - - "nltk" - "scikit-learn" - "langdetect" - "rapidfuzz" diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml index ad55763a9..1e0ba23b1 100644 --- a/.github/workflows/ci-backend.yml +++ b/.github/workflows/ci-backend.yml @@ -12,7 +12,9 @@ concurrency: cancel-in-progress: true env: DEFAULT_UV_VERSION: "0.12.x" - NLTK_DATA: "/usr/share/nltk_data" + # Match the Docker image: nltk refuses to read hardlinked data files, such as + # the copy bundled with llama-index when uv links packages from its cache + UV_LINK_MODE: copy permissions: {} jobs: changes: @@ -78,7 +80,7 @@ jobs: needs: changes if: needs.changes.outputs.backend_changed == 'true' name: "Python ${{ matrix.python-version }}" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read strategy: @@ -100,20 +102,19 @@ jobs: with: python-version: "${{ matrix.python-version }}" - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true python-version: ${{ steps.setup-python.outputs.python-version }} - name: Install system dependencies - timeout-minutes: 10 - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends \ - unpaper tesseract-ocr imagemagick ghostscript poppler-utils + timeout-minutes: 12 + uses: $/.github/actions/apt-install + with: + packages: unpaper tesseract-ocr imagemagick ghostscript poppler-utils - name: Configure ImageMagick run: | - sudo cp docker/rootfs/etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml + sudo cp docker/rootfs/etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-7/policy.xml - name: Install Python dependencies env: PYTHON_VERSION: ${{ steps.setup-python.outputs.python-version }} @@ -125,12 +126,8 @@ jobs: - name: List installed Python dependencies run: | uv pip list - - name: Install NLTK data - run: | - uv run python -m nltk.downloader punkt punkt_tab snowball_data stopwords -d "${NLTK_DATA}" - name: Run tests env: - NLTK_DATA: ${{ env.NLTK_DATA }} PAPERLESS_CI_TEST: 1 PYTHON_VERSION: ${{ steps.setup-python.outputs.python-version }} run: | @@ -141,13 +138,13 @@ jobs: pytest - name: Upload test results to Codecov if: always() - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 with: flags: backend-python-${{ matrix.python-version }} files: junit.xml report_type: test_results - name: Upload coverage to Codecov - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 with: flags: backend-python-${{ matrix.python-version }} files: coverage.xml @@ -161,7 +158,7 @@ jobs: needs: changes if: needs.changes.outputs.backend_changed == 'true' name: Check project typing - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read env: @@ -178,7 +175,7 @@ jobs: with: python-version: "${{ env.DEFAULT_PYTHON }}" - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 3fe9a9892..7b1c7f0ff 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -24,10 +24,10 @@ jobs: fail-fast: false matrix: include: - - runner: ubuntu-24.04 + - runner: ubuntu-26.04 arch: amd64 platform: linux/amd64 - - runner: ubuntu-24.04-arm + - runner: ubuntu-26.04-arm arch: arm64 platform: linux/arm64 runs-on: ${{ matrix.runner }} @@ -106,7 +106,7 @@ jobs: echo "repository=${repo_name}" echo "name=${repo_name}" >> $GITHUB_OUTPUT - name: Set up Docker Buildx - uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 + uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1 - name: Login to GitHub Container Registry uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 with: @@ -132,7 +132,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} - name: Build and push by digest id: build - uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 + uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0 with: context: . file: ./Dockerfile @@ -163,7 +163,7 @@ jobs: archive: false merge-and-push: name: Merge and Push Manifest - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: build-arch if: needs.build-arch.outputs.should-push == 'true' environment: image-publishing @@ -182,7 +182,7 @@ jobs: echo "Downloaded digests:" ls -la /tmp/digests/ - name: Set up Docker Buildx - uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 + uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1 - name: Login to GitHub Container Registry uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 with: diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index f919f1929..8ec66b71f 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -65,7 +65,7 @@ jobs: needs: changes if: needs.changes.outputs.docs_changed == 'true' name: Build Documentation - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - name: Checkout @@ -78,7 +78,7 @@ jobs: with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -102,7 +102,7 @@ jobs: name: Deploy Documentation needs: [changes, build] if: github.event_name == 'push' && github.ref == 'refs/heads/main' && needs.changes.outputs.docs_changed == 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: pages: write id-token: write @@ -111,7 +111,7 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy GitHub Pages - uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1 id: deployment with: artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index 8678bf487..c1394ccd3 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -72,7 +72,7 @@ jobs: needs: changes if: needs.changes.outputs.frontend_changed == 'true' name: Install Dependencies - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read steps: @@ -81,7 +81,7 @@ jobs: with: persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 @@ -104,7 +104,7 @@ jobs: name: Lint needs: [changes, install-dependencies] if: needs.changes.outputs.frontend_changed == 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read steps: @@ -113,7 +113,7 @@ jobs: with: persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 @@ -137,7 +137,7 @@ jobs: name: "Unit Tests (${{ matrix.shard-index }}/${{ matrix.shard-count }})" needs: [changes, install-dependencies] if: needs.changes.outputs.frontend_changed == 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read strategy: @@ -152,7 +152,7 @@ jobs: with: persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 @@ -174,13 +174,13 @@ jobs: run: cd src-ui && pnpm run test --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }} - name: Upload test results to Codecov if: always() - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 with: flags: frontend-node-${{ matrix.node-version }} directory: src-ui/ report_type: test_results - name: Upload coverage to Codecov - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 with: flags: frontend-node-${{ matrix.node-version }} directory: src-ui/coverage/ @@ -188,10 +188,10 @@ jobs: name: E2E Tests needs: [changes, install-dependencies] if: needs.changes.outputs.frontend_changed == 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read - container: mcr.microsoft.com/playwright:v1.62.1-noble + container: mcr.microsoft.com/playwright:v1.62.1-resolute env: PLAYWRIGHT_BROWSERS_PATH: /ms-playwright PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 @@ -201,7 +201,7 @@ jobs: with: persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 @@ -216,7 +216,7 @@ jobs: with: python-version: '3.12' - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: '0.12.x' enable-cache: false @@ -231,9 +231,10 @@ jobs: - name: Install dependencies run: cd src-ui && pnpm install --frozen-lockfile - name: Install backend system dependencies - run: | - apt-get update - apt-get install --yes --quiet --no-install-recommends libmagic1 + timeout-minutes: 12 + uses: $/.github/actions/apt-install + with: + packages: libmagic1 - name: Install backend dependencies env: PYTHON_VERSION: ${{ steps.setup-python.outputs.python-version }} @@ -245,7 +246,7 @@ jobs: name: Frontend Build needs: [changes, unit-tests, e2e-tests] if: needs.changes.outputs.frontend_changed == 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read steps: @@ -255,7 +256,7 @@ jobs: fetch-depth: 2 persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index f4d24d9a6..9dfb74dc9 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -14,7 +14,7 @@ permissions: {} jobs: wait-for-docker: name: Wait for Docker Build - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: checks: read statuses: read @@ -30,7 +30,7 @@ jobs: build-release: name: Build Release needs: wait-for-docker - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read steps: @@ -40,7 +40,7 @@ jobs: persist-credentials: false # ---- Frontend Build ---- - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 @@ -59,7 +59,7 @@ jobs: with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: false @@ -70,9 +70,10 @@ jobs: run: | uv sync --python "${PYTHON_VERSION}" --dev --frozen - name: Install system dependencies - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends gettext liblept5 + timeout-minutes: 12 + uses: $/.github/actions/apt-install + with: + packages: gettext libleptonica6 # ---- Build Documentation ---- - name: Build documentation env: @@ -144,7 +145,7 @@ jobs: publish-release: name: Publish Release needs: build-release - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: write pull-requests: write @@ -196,7 +197,7 @@ jobs: name: Append Changelog needs: publish-release if: needs.publish-release.outputs.prerelease == 'false' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: write pull-requests: write @@ -212,7 +213,7 @@ jobs: with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: false diff --git a/.github/workflows/ci-static-analysis.yml b/.github/workflows/ci-static-analysis.yml index b3a0d3d18..d774194e0 100644 --- a/.github/workflows/ci-static-analysis.yml +++ b/.github/workflows/ci-static-analysis.yml @@ -15,7 +15,7 @@ permissions: jobs: zizmor: name: Run zizmor - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read actions: read @@ -26,10 +26,10 @@ jobs: with: persist-credentials: false - name: Run zizmor - uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2 + uses: zizmorcore/zizmor-action@cc914d7f3750a2d13d75c7f184a1060aa0e9d482 # v0.6.4 semgrep: name: Semgrep CE - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 container: image: semgrep/semgrep:1.155.0@sha256:cc869c685dcc0fe497c86258da9f205397d8108e56d21a86082ea4886e52784d if: github.actor != 'dependabot[bot]' @@ -44,7 +44,7 @@ jobs: - name: Run Semgrep run: semgrep scan --config auto --sarif-output results.sarif - name: Upload results to GitHub code scanning - uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9 + uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 if: always() with: sarif_file: results.sarif diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index 3c4eca455..f09691504 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -17,7 +17,7 @@ jobs: cleanup-images: name: Cleanup Image Tags for ${{ matrix.primary-name }} if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 environment: registry-maintenance strategy: fail-fast: false @@ -29,7 +29,7 @@ jobs: steps: - name: Clean temporary images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/ephemeral@4fe057d991d63b8f6d5d22c40f17c1bca2226537 # v0.12.0 + uses: stumpylog/image-cleaner-action/ephemeral@21f875bab2376314e0525c614e923c669434f0e4 # v0.13.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" @@ -42,7 +42,7 @@ jobs: cleanup-untagged-images: name: Cleanup Untagged Images Tags for ${{ matrix.primary-name }} if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: - cleanup-images environment: registry-maintenance @@ -56,7 +56,7 @@ jobs: steps: - name: Clean untagged images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/untagged@4fe057d991d63b8f6d5d22c40f17c1bca2226537 # v0.12.0 + uses: stumpylog/image-cleaner-action/untagged@21f875bab2376314e0525c614e923c669434f0e4 # v0.13.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 05924921a..424e52164 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,7 +21,7 @@ on: jobs: analyze: name: Analyze - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: actions: read contents: read @@ -39,7 +39,7 @@ jobs: persist-credentials: false # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9 + uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -47,4 +47,4 @@ jobs: # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9 + uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 367769d03..4f7b8a395 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -13,7 +13,7 @@ jobs: synchronize-with-crowdin: name: Crowdin Sync if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 environment: translation-sync steps: - name: Checkout @@ -22,7 +22,7 @@ jobs: token: ${{ secrets.PNGX_BOT_PAT }} persist-credentials: false - name: crowdin action - uses: crowdin/github-action@e4a6c1338b4063c77d46a81875265f9e8bd76f95 # v3.0.0 + uses: crowdin/github-action@9c23991700c0ec5256fd41089b9d9d7d540e424e # v3.3.0 with: upload_translations: false download_translations: true diff --git a/.github/workflows/issue-bot.yml b/.github/workflows/issue-bot.yml index 1950f59b6..939726564 100644 --- a/.github/workflows/issue-bot.yml +++ b/.github/workflows/issue-bot.yml @@ -7,7 +7,7 @@ jobs: # Note: peakoss/anti-slop does not support the `issues` event yet (all of its # issue inputs are still commented out upstream), so the checks that the PR Bot # workflow gets from the action are implemented manually here. - runs-on: ubuntu-latest + runs-on: ubuntu-slim permissions: issues: write steps: @@ -43,6 +43,12 @@ jobs: const haystack = `${issue.title}\n${issue.body ?? ''}`; const honeypot = haystack.toUpperCase().includes('ASLOP-PR-VERIFY'); + // The form's required "AI usage" dropdown renders as a `### AI usage` section. An agent + // that follows the template trips the honeypot even when it discloses, so only treat + // the honeypot as undisclosed AI use when the reporter did not answer "Yes" here. + const aiUsage = (issue.body ?? '').match(/^###\s+AI usage\s*\n+\s*(.+?)\s*$/m)?.[1] ?? ''; + const disclosedAI = aiUsage.toLowerCase().startsWith('yes'); + // Issues opened through the form always get the template's default labels. GitHub // applies them a second or two *after* creation, so re-read them instead of trusting // the webhook payload, and retry before concluding that there are none. @@ -55,19 +61,30 @@ jobs: if (labels.some((label) => templateLabels.includes(label))) break; } const bypassedTemplate = !labels.some((label) => templateLabels.includes(label)); - core.info(`Labels: [${labels.join(', ')}], honeypot: ${honeypot}, bypassed template: ${bypassedTemplate}`); + core.info( + `Labels: [${labels.join(', ')}], honeypot: ${honeypot}, AI usage: "${aiUsage}", ` + + `bypassed template: ${bypassedTemplate}` + ); - if (!honeypot && !bypassedTemplate) { - core.info('No slop signals found'); + if (!bypassedTemplate && (disclosedAI || !honeypot)) { + if (disclosedAI) { + core.info('AI use disclosed, labeling only'); + await github.rest.issues.addLabels({ ...common, labels: ['ai'] }); + } else { + core.info('No slop signals found'); + } return; } - // The honeypot is only ever tripped deliberately, so that message can name the cause. // A missing template label only tells us the issue did not come from the form, which - // is reason enough to close it, but not proof of how it was written. - const body = honeypot + // is reason enough to close it, but not proof of how it was written. It takes priority: + // a hand-built body can carry the honeypot *and* a disclosure, and the form message is + // the only one that is accurate for both. Reaching the honeypot message means the issue + // came from the form without disclosing AI usage, so that message can name the cause. + const body = honeypot && !bypassedTemplate ? 'This issue was automatically closed because it contains a marker that is only visible to ' + - 'automated tools, which indicates it was generated by an AI agent without being disclosed as such.\n\n' + + 'automated tools, which indicates it was generated by an AI agent, but the "AI usage" field does not ' + + 'disclose this.\n\n' + `Please see our [contributing guidelines](${contributing}) and [Code of Conduct](${codeOfConduct}). ` + 'You are welcome to open a new issue that describes the problem you observed in your own words.' : 'This issue was automatically closed because it was not opened using our bug report form. ' + diff --git a/.github/workflows/pr-bot.yml b/.github/workflows/pr-bot.yml index f7d69039d..3bcfe8f8d 100644 --- a/.github/workflows/pr-bot.yml +++ b/.github/workflows/pr-bot.yml @@ -4,7 +4,7 @@ on: types: [opened] jobs: Anti-slop: - runs-on: ubuntu-latest + runs-on: ubuntu-slim permissions: contents: read issues: read @@ -24,7 +24,7 @@ jobs: ASLOP-PR-VERIFY pr-bot: name: Automated PR Bot - runs-on: ubuntu-latest + runs-on: ubuntu-slim # Runs after Anti-slop so the welcome comment can see whether the PR was closed # instead of racing it. Still runs if that job fails, so labeling is not lost. needs: Anti-slop @@ -38,16 +38,6 @@ jobs: uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Label by size - uses: Gascon1/pr-size-labeler@deff8ed00a76639a7c0f197525bafa3350ba4c36 # v1.3.0 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - xs_label: 'small-change' - xs_diff: '9' - s_label: 'non-trivial' - s_diff: '99999' - fail_if_xl: 'false' - excluded_files: /\.lock$/ /\.txt$/ ^src-ui/pnpm-lock\.yaml$ ^src-ui/messages\.xlf$ ^src/locale/en_US/LC_MESSAGES/django\.po$ - name: Label by PR title uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml index cd4f65a89..e2941292b 100644 --- a/.github/workflows/project-actions.yml +++ b/.github/workflows/project-actions.yml @@ -12,7 +12,7 @@ permissions: jobs: pr_opened_or_reopened: name: pr_opened_or_reopened - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim permissions: # write permission is required for autolabeler pull-requests: write diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml index 0b40b17bc..0c5554946 100644 --- a/.github/workflows/repo-maintenance.yml +++ b/.github/workflows/repo-maintenance.yml @@ -9,7 +9,7 @@ jobs: stale: name: 'Stale' if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: issues: write pull-requests: write @@ -34,7 +34,7 @@ jobs: lock-threads: name: 'Lock Old Threads' if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: issues: write pull-requests: write @@ -58,7 +58,7 @@ jobs: close-answered-discussions: name: 'Close Answered Discussions' if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim permissions: discussions: write steps: @@ -117,7 +117,7 @@ jobs: close-outdated-discussions: name: 'Close Outdated Discussions' if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim permissions: discussions: write steps: @@ -211,7 +211,7 @@ jobs: close-unsupported-feature-requests: name: 'Close Unsupported Feature Requests' if: github.repository_owner == 'paperless-ngx' - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim permissions: discussions: write steps: diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml index 0dfe77d39..13fe3c0f6 100644 --- a/.github/workflows/translate-strings.yml +++ b/.github/workflows/translate-strings.yml @@ -8,7 +8,7 @@ env: jobs: generate-translate-strings: name: Generate Translation Strings - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 environment: translation-sync permissions: contents: write @@ -25,11 +25,12 @@ jobs: id: setup-python uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - name: Install system dependencies - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends gettext + timeout-minutes: 12 + uses: $/.github/actions/apt-install + with: + packages: gettext - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -43,7 +44,7 @@ jobs: PAPERLESS_SECRET_KEY: "ci-translate-not-a-real-secret" run: cd src/ && uv run manage.py makemessages -l en_US -i "samples*" - name: Install pnpm - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: package_json_file: src-ui/package.json - name: Use Node.js 24 diff --git a/.mypy-baseline.txt b/.mypy-baseline.txt index 53cd76c5a..ef9043fd8 100644 --- a/.mypy-baseline.txt +++ b/.mypy-baseline.txt @@ -19,31 +19,34 @@ src/documents/admin.py:0: error: Skipping analyzing "auditlog.admin": module is src/documents/admin.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/admin.py:0: error: Skipping analyzing "treenode.admin": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/barcodes.py:0: error: "Image" has no attribute "filename" [attr-defined] -src/documents/barcodes.py:0: error: Cannot find implementation or library stub for module named "zxingcpp" [import-not-found] -src/documents/barcodes.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] src/documents/bulk_edit.py:0: error: "int" object is not iterable [misc] src/documents/bulk_edit.py:0: error: "int" object is not iterable [misc] +src/documents/bulk_edit.py:0: error: Argument "args" to "apply_async" of "Task" has incompatible type "list[int]"; expected "tuple[Any, ...] | None" [arg-type] +src/documents/bulk_edit.py:0: error: Cannot determine type of "field_id" [has-type] +src/documents/bulk_edit.py:0: error: Cannot determine type of "field_id" [has-type] +src/documents/bulk_edit.py:0: error: Cannot determine type of "value" [has-type] +src/documents/bulk_edit.py:0: error: Cannot determine type of "value" [has-type] +src/documents/bulk_edit.py:0: error: Cannot determine type of "value" [has-type] src/documents/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/bulk_edit.py:0: error: Incompatible return value type (got "Literal['ERROR']", expected "Literal['OK']") [return-value] src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "Correspondent", expected "str | int") [misc] src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "DocumentType", expected "str | int") [misc] src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "StoragePath", expected "str | int") [misc] -src/documents/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "dict_items[Any, Any] | list[int]", variable has type "list[int] | dict[Any, Any]") [assignment] +src/documents/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "int | None", target has type "datetime") [assignment] src/documents/bulk_edit.py:0: error: Invalid index type "str" for "dict[FieldDataType, str]"; expected type "FieldDataType" [index] +src/documents/bulk_edit.py:0: error: List comprehension has incompatible type List[tuple[int, Any]]; expected List[int] [misc] src/documents/bulk_edit.py:0: error: List comprehension has incompatible type List[tuple[int, None]]; expected List[int] [misc] src/documents/bulk_edit.py:0: error: Missing named argument "p" for "remove" of "PageList" [call-arg] src/documents/bulk_edit.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/bulk_edit.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/bulk_edit.py:0: error: Need type annotation for "to_create" (hint: "to_create: list[] = ...") [var-annotated] +src/documents/bulk_edit.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/bulk_edit.py:0: error: Unexpected keyword argument "transaction_id" for "delete" of "QuerySet" [call-arg] src/documents/caching.py:0: error: Argument 1 to "hexlify" has incompatible type "bytes | None"; expected "Buffer" [arg-type] src/documents/caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/caching.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/caching.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/caching.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -51,9 +54,11 @@ src/documents/caching.py:0: error: Missing type arguments for generic type "list src/documents/caching.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/caching.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/caching.py:0: error: Missing type arguments for generic type "list" [type-arg] -src/documents/caching.py:0: error: Need type annotation for "_data" [var-annotated] src/documents/checks.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/classifier.py:0: error: "MLPClassifier" has no attribute "_best_coefs" [attr-defined] +src/documents/classifier.py:0: error: "MLPClassifier" has no attribute "_best_intercepts" [attr-defined] +src/documents/classifier.py:0: error: "MLPClassifier" has no attribute "_optimizer" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] @@ -61,15 +66,15 @@ src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defin src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] -src/documents/classifier.py:0: error: "None" has no attribute "stem" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "stop_words_" [attr-defined] src/documents/classifier.py:0: error: "None" has no attribute "transform" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "transform" [attr-defined] +src/documents/classifier.py:0: error: Argument 1 to "_strip_training_state" of "DocumentClassifier" has incompatible type "None"; expected "MLPClassifier" [arg-type] +src/documents/classifier.py:0: error: Argument 1 to "_strip_training_state" of "DocumentClassifier" has incompatible type "None"; expected "MLPClassifier" [arg-type] +src/documents/classifier.py:0: error: Argument 1 to "_strip_training_state" of "DocumentClassifier" has incompatible type "None"; expected "MLPClassifier" [arg-type] +src/documents/classifier.py:0: error: Argument 1 to "_strip_training_state" of "DocumentClassifier" has incompatible type "None"; expected "MLPClassifier" [arg-type] src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "CountVectorizer", variable has type "None") [assignment] src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "LabelBinarizer", variable has type "None") [assignment] @@ -82,15 +87,11 @@ src/documents/classifier.py:0: error: Incompatible types in assignment (expressi src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] -src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "frozenset[Any]", variable has type "None") [assignment] src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Item "None" of "str | None" has no attribute "encode" [union-attr] src/documents/classifier.py:0: error: List comprehension has incompatible type List[int]; expected List[list[int]] [misc] src/documents/classifier.py:0: error: Module "sklearn.exceptions" has no attribute "InconsistentVersionWarning" [attr-defined] -src/documents/classifier.py:0: error: Skipping analyzing "nltk": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/classifier.py:0: error: Skipping analyzing "nltk.corpus": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/classifier.py:0: error: Skipping analyzing "nltk.stem": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/classifier.py:0: error: Skipping analyzing "nltk.tokenize": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/classifier.py:0: error: Unsupported right operand type for in ("None") [operator] +src/documents/classifier.py:0: error: Unsupported operand types for >= ("datetime" and "None") [operator] src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -113,7 +114,7 @@ src/documents/consumer.py:0: error: Argument "logger" to "run_subprocess" has in src/documents/consumer.py:0: error: Argument "text" to "_store" of "ConsumerPlugin" has incompatible type "str | Any | None"; expected "str" [arg-type] src/documents/consumer.py:0: error: Argument 1 to "compute_checksum" has incompatible type "Path | None"; expected "Path" [arg-type] src/documents/consumer.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | None"; expected "Path" [arg-type] -src/documents/consumer.py:0: error: Argument 2 to "parse" of "DateParserPluginBase" has incompatible type "str | Any | None"; expected "str" [arg-type] +src/documents/consumer.py:0: error: Argument 1 to "validate_path_in_root" has incompatible type "Path | None"; expected "Path" [arg-type] src/documents/consumer.py:0: error: Argument 2 to "parse_w_workflow_placeholders" has incompatible type "str | None"; expected "str" [arg-type] src/documents/consumer.py:0: error: Argument 3 to "parse_w_workflow_placeholders" has incompatible type "str | None"; expected "str" [arg-type] src/documents/consumer.py:0: error: Argument 3 to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] @@ -147,6 +148,18 @@ src/documents/data_models.py:0: error: Item "list[str]" of "Any | list[str]" has src/documents/data_models.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/data_models.py:0: error: Value of type "Group | dict[Any, Any]" is not indexable [index] src/documents/data_models.py:0: error: Value of type "Group | dict[Any, Any]" is not indexable [index] +src/documents/export/sinks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "AbstractContextManager" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/export/sinks.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/file_handling.py:0: error: Argument 1 to "format_filename" has incompatible type "Document | None"; expected "Document" [arg-type] src/documents/file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -181,6 +194,8 @@ src/documents/filters.py:0: error: Function is missing a type annotation [no-un src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/filters.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -197,7 +212,7 @@ src/documents/filters.py:0: error: Incompatible types in assignment (expression src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "ListField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "MonetaryAmountField", variable has type "BooleanField | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "SelectField", variable has type "BooleanField | None") [assignment] -src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "Sum", variable has type "Subquery | None") [assignment] +src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "Sum", variable has type "Subquery[Field[Any, Any]] | None") [assignment] src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "list[str]") [assignment] src/documents/filters.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/filters.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] @@ -206,14 +221,11 @@ src/documents/filters.py:0: error: Missing type arguments for generic type "Call src/documents/filters.py:0: error: Missing type arguments for generic type "Field" [type-arg] src/documents/filters.py:0: error: Need type annotation for "_annotations" (hint: "_annotations: dict[, ] = ...") [var-annotated] src/documents/filters.py:0: error: Need type annotation for "_model_serializer" [var-annotated] -src/documents/filters.py:0: error: Skipping analyzing "rest_framework_guardian.filters": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/filters.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/loggers.py:0: error: "LoggingMixin" has no attribute "logging_name" [attr-defined] src/documents/mail.py:0: error: Incompatible types in assignment (expression has type "Message[str, str]", variable has type "bytes") [assignment] src/documents/management/commands/convert_mariadb_uuid.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/management/commands/convert_mariadb_uuid.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/management/commands/convert_mariadb_uuid.py:0: error: Need type annotation for "new_field" [var-annotated] -src/documents/management/commands/convert_mariadb_uuid.py:0: error: Need type annotation for "old_field" [var-annotated] src/documents/management/commands/document_archiver.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/management/commands/document_archiver.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/management/commands/document_consumer.py:0: error: "str" has no attribute "is_file" [attr-defined] @@ -222,14 +234,9 @@ src/documents/management/commands/document_consumer.py:0: error: Function is mis src/documents/management/commands/document_consumer.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/management/commands/document_consumer.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] src/documents/management/commands/document_create_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/management/commands/document_exporter.py:0: error: "None" has no attribute "write" [attr-defined] -src/documents/management/commands/document_exporter.py:0: error: "None" has no attribute "write" [attr-defined] -src/documents/management/commands/document_exporter.py:0: error: "None" has no attribute "write" [attr-defined] src/documents/management/commands/document_exporter.py:0: error: Argument 1 to "add" of "set" has incompatible type "Path"; expected "str" [arg-type] src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/management/commands/document_exporter.py:0: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "None") [assignment] src/documents/management/commands/document_exporter.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "Path") [assignment] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -238,9 +245,6 @@ src/documents/management/commands/document_exporter.py:0: error: Missing type ar src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] -src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] -src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] -src/documents/management/commands/document_exporter.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/management/commands/document_exporter.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -260,6 +264,10 @@ src/documents/management/commands/document_importer.py:0: error: Missing type ar src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/management/commands/document_importer.py:0: error: Need type annotation for "manifest_paths" (hint: "manifest_paths: list[] = ...") [var-annotated] src/documents/management/commands/document_importer.py:0: error: Skipping analyzing "auditlog.registry": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/management/commands/document_importer.py:0: error: Skipping analyzing "ijson": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -292,13 +300,8 @@ src/documents/matching.py:0: error: Function is missing a type annotation for on src/documents/matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] -src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] -src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] -src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] -src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] src/documents/matching.py:0: error: Unsupported left operand type for & ("None") [operator] src/documents/matching.py:0: error: Unsupported left operand type for & ("None") [operator] -src/documents/matching.py:0: error: Value of type variable "AnyStr" of "fnmatch" cannot be "object" [type-var] src/documents/migrations/0001_squashed.py:0: error: Skipping analyzing "multiselectfield": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/migrations/0001_squashed.py:0: error: Skipping analyzing "multiselectfield.db": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/migrations/0001_squashed.py:0: error: Skipping analyzing "multiselectfield.db.fields": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -340,37 +343,13 @@ src/documents/models.py:0: error: Function is missing a type annotation [no-unt src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/models.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/models.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "expiration" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "field" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "file_version" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "note" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "owner" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "run_at" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "slug" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "type" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "user" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_bool" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_date" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_float" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_int" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_long_text" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_monetary" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_select" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_text" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "value_url" [var-annotated] -src/documents/models.py:0: error: Need type annotation for "workflow" [var-annotated] src/documents/models.py:0: error: Signature of "delete" incompatible with supertype "django.db.models.base.Model" [override] src/documents/models.py:0: error: Skipping analyzing "auditlog.registry": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/models.py:0: error: Skipping analyzing "django_softdelete.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/models.py:0: error: Skipping analyzing "multiselectfield": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/models.py:0: error: Skipping analyzing "treenode.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/models.py:0: error: Unexpected keyword argument "transaction_id" for "delete" of "Model" [call-arg] +src/documents/models.py:0: error: Unexpected keyword argument "transaction_id" for "delete" of "QuerySet" [call-arg] src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -383,7 +362,9 @@ src/documents/parsers.py:0: error: Function is missing a type annotation for one src/documents/parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: "type[Model]" has no attribute "global_objects" [attr-defined] +src/documents/permissions.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] +src/documents/permissions.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -392,74 +373,55 @@ src/documents/permissions.py:0: error: Function is missing a type annotation [n src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/permissions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exclude" [union-attr] src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exists" [union-attr] src/documents/permissions.py:0: error: Item "list[str]" of "Any | list[str] | QuerySet[User, User]" has no attribute "exists" [union-attr] +src/documents/permissions.py:0: error: Missing type arguments for generic type "QuerySet" [type-arg] src/documents/permissions.py:0: error: Missing type arguments for generic type "dict" [type-arg] -src/documents/plugins/date_parsing/regex_parser.py:0: error: Library stubs not installed for "regex" [import-untyped] +src/documents/permissions.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/permissions.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/permissions.py:0: error: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var] +src/documents/permissions.py:0: error: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var] src/documents/plugins/helpers.py:0: error: Skipping analyzing "channels_redis.pubsub": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/regex.py:0: error: "error" has no attribute "msg" [attr-defined] src/documents/regex.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/regex.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/regex.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/regex.py:0: error: Library stubs not installed for "regex" [import-untyped] +src/documents/regex.py:0: error: Missing type arguments for generic type "Pattern" [type-arg] src/documents/sanity_checker.py:0: error: Unused "type: ignore" comment [unused-ignore] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/schema.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/search/_backend.py:0: error: "AbstractBaseUser" has no attribute "is_superuser" [attr-defined] src/documents/search/_backend.py:0: error: "None" has no attribute "acquire" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "add_document" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "commit" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "delete_documents_by_query" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "parse_query" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "reload" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "schema" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "searcher" [attr-defined] -src/documents/search/_backend.py:0: error: "None" has no attribute "writer" [attr-defined] -src/documents/search/_backend.py:0: error: Argument 1 to "build_permission_filter" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "build_permission_filter" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_text_highlight_query" has incompatible type "None"; expected "Index" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_text_query" has incompatible type "None"; expected "Index" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "parse_simple_title_query" has incompatible type "None"; expected "Index" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "parse_user_query" has incompatible type "None"; expected "Index" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "regex_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "register_tokenizers" has incompatible type "None"; expected "Index" [arg-type] -src/documents/search/_backend.py:0: error: Argument 1 to "term_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] -src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] -src/documents/search/_backend.py:0: error: Argument 2 to "add_unsigned" of "Document" has incompatible type "int | None"; expected "int" [arg-type] -src/documents/search/_backend.py:0: error: Argument 3 to "create" of "SnippetGenerator" has incompatible type "None"; expected "Schema" [arg-type] -src/documents/search/_backend.py:0: error: Argument 3 to "create" of "SnippetGenerator" has incompatible type "None"; expected "Schema" [arg-type] +src/documents/search/_backend.py:0: error: Argument "args" to "apply_async" of "Task" has incompatible type "list[int]"; expected "tuple[Any, ...] | None" [arg-type] +src/documents/search/_backend.py:0: error: Argument "args" to "apply_async" of "Task" has incompatible type "list[int]"; expected "tuple[Any, ...] | None" [arg-type] +src/documents/search/_backend.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/search/_backend.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "Index", variable has type "None") [assignment] -src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "Index", variable has type "None") [assignment] -src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "Index", variable has type "None") [assignment] -src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "Schema", variable has type "None") [assignment] src/documents/search/_backend.py:0: error: Incompatible types in assignment (expression has type "SoftFileLock", variable has type "None") [assignment] -src/documents/search/_backend.py:0: error: Item "str" of "Any | str" has no attribute "pk" [union-attr] -src/documents/search/_backend.py:0: error: Library stubs not installed for "regex" [import-untyped] -src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[Any, Any]]; expected List[tuple[Any]] [misc] -src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[Any, Any]]; expected List[tuple[Any]] [misc] +src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[DocAddress, Any]]; expected List[tuple[DocAddress]] [misc] +src/documents/search/_backend.py:0: error: List comprehension has incompatible type List[tuple[DocAddress, Any]]; expected List[tuple[DocAddress]] [misc] +src/documents/search/_backend.py:0: error: Return type "Iterator[tuple[Document, ViewerGrant]]" of "__iter__" incompatible with return type "Iterator[Document]" in supertype "documents.utils.QuerySetStream" [override] src/documents/search/_backend.py:0: error: Tuple index out of range [misc] src/documents/search/_backend.py:0: error: Tuple index out of range [misc] src/documents/search/_backend.py:0: error: Tuple index out of range [misc] -src/documents/search/_query.py:0: error: Argument 3 to "regex_phrase_query" of "Query" has incompatible type "list[str]"; expected "list[str | tuple[int, str]]" [arg-type] -src/documents/search/_query.py:0: error: Library stubs not installed for "regex" [import-untyped] +src/documents/search/_query.py:0: error: Argument "field" to "Fuzzy" has incompatible type "FieldRef | None"; expected "FieldRef" [arg-type] +src/documents/search/_query.py:0: error: Argument 3 to "Term" has incompatible type "**dict[str, int | None]"; expected "bool" [arg-type] +src/documents/search/_query.py:0: error: Argument 3 to "Term" has incompatible type "**dict[str, int | None]"; expected "bool" [arg-type] +src/documents/search/_query.py:0: error: Unexpected keyword argument "children" for "Node" [call-arg] +src/documents/search/_schema.py:0: error: Redundant cast to "Path" [redundant-cast] +src/documents/search/_schema.py:0: error: Unexpected keyword argument "fast" for "add_json_field" of "SchemaBuilder" [call-arg] +src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "_meta" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: Argument "choices" to "ChoiceField" has incompatible type "type[FieldDataType]"; expected "Sequence[Any]" [arg-type] src/documents/serialisers.py:0: error: Argument "default" to "MultipleChoiceField" has incompatible type "set[DocumentSource]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type] -src/documents/serialisers.py:0: error: Argument 1 of "get_value" is incompatible with supertype "rest_framework.fields.Field"; supertype defines the argument type as "Mapping[Any, Any]" [override] +src/documents/serialisers.py:0: error: Argument 1 of "get_value" is incompatible with supertype "rest_framework.fields.Field"; supertype defines the argument type as "Mapping[str, Any]" [override] src/documents/serialisers.py:0: error: Argument 1 of "update" is incompatible with supertype "rest_framework.serializers.BaseSerializer"; supertype defines the argument type as "dict[str, Any]" [override] +src/documents/serialisers.py:0: error: Argument 1 to "__get__" of "BaseManager" has incompatible type "PrimaryKeyRelatedField[Any]"; expected "Options[Any] | None" [arg-type] src/documents/serialisers.py:0: error: Argument 1 to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type] -src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] src/documents/serialisers.py:0: error: Argument 1 to "list" has incompatible type "QuerySet[Document, TypedDict({'id': int, 'title': str, 'deleted_at': datetime | None})]"; expected "Iterable[dict[str, Any]]" [arg-type] src/documents/serialisers.py:0: error: Expected iterable as variadic argument [misc] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -536,6 +498,15 @@ src/documents/serialisers.py:0: error: Function is missing a type annotation [n src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -575,7 +546,6 @@ src/documents/serialisers.py:0: error: Function is missing a type annotation for src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "PrimaryKeyRelatedField[Tag]", base class "Field" defined the type as "BaseSerializer[Any]") [assignment] -src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "UnknownQuerySet[Document, Document]") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "Sequence[str] | tuple[Lower]", variable has type "Sequence[str] | None") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "WorkflowActionWebhookSerializer", variable has type "WorkflowActionEmailSerializer") [assignment] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[Correspondent]", variable has type "type[Tag] | None") [assignment] @@ -594,24 +564,29 @@ src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] -src/documents/serialisers.py:0: error: Item "None" of "ObjectPermissionChecker | None" has no attribute "has_perm" [union-attr] src/documents/serialisers.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Field" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Iterable" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Need type annotation for "document" [var-annotated] src/documents/serialisers.py:0: error: Need type annotation for "documents" [var-annotated] src/documents/serialisers.py:0: error: Need type annotation for "permissions_dict" [var-annotated] -src/documents/serialisers.py:0: error: Need type annotation for "with_perms" [var-annotated] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/serialisers.py:0: error: Unsupported target for indexed assignment ("Mapping[str, Any] | Any") [index] +src/documents/serialisers.py:0: error: Unsupported target for indexed assignment ("Mapping[str, Any] | Any") [index] +src/documents/serialisers.py:0: error: Unsupported target for indexed assignment ("Mapping[str, Any] | Any") [index] +src/documents/serialisers.py:0: error: Unsupported target for indexed assignment ("Mapping[str, Any]") [index] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/serialisers.py:0: error: Value of type "Match[str] | None" is not indexable [index] src/documents/signals/handlers.py:0: error: "BaseDatabaseWrapper" has no attribute "close_pool" [attr-defined] +src/documents/signals/handlers.py:0: error: "BaseDatabaseWrapper" has no attribute "close_pool" [attr-defined] +src/documents/signals/handlers.py:0: error: "Task[[int, int], Any]" has no attribute "delay_on_commit" [attr-defined] src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Path | Any | None"; expected "str | PathLike[str]" [arg-type] @@ -645,9 +620,11 @@ src/documents/signals/handlers.py:0: error: Function is missing a type annotatio src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "Any | None", target has type "datetime") [assignment] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "str", target has type "datetime") [assignment] src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "tuple[Any, Any, Any]", variable has type "tuple[Any, Any]") [assignment] +src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "pk" [union-attr] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "save" [union-attr] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "source_path" [union-attr] src/documents/signals/handlers.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "title" [union-attr] @@ -679,6 +656,9 @@ src/documents/tasks.py:0: error: Function is missing a type annotation for one o src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tasks.py:0: error: Incompatible return value type (got "str | None", expected "ConsumeFileSuccessResult | ConsumeFileStoppedResult | ConsumeFileDuplicateResult | None") [return-value] src/documents/tasks.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] src/documents/tasks.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Document, Document]", variable has type "UnknownQuerySet[Document, Document]") [assignment] @@ -700,16 +680,6 @@ src/documents/templating/filters.py:0: error: Incompatible types in assignment ( src/documents/templating/filters.py:0: error: Item "str" of "str | datetime" has no attribute "strftime" [union-attr] src/documents/templating/utils.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/templating/workflows.py:0: error: Incompatible return value type (got "None", expected "str") [return-value] -src/documents/tests/conftest.py:0: error: "type[UserModelT?]" has no attribute "objects" [attr-defined] -src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/conftest.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/conftest.py:0: error: Incompatible return value type (got "DocumentFactory", expected "Document") [return-value] -src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] -src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] -src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] -src/documents/tests/conftest.py:0: error: Variable "documents.tests.conftest.UserModelT" is not valid as a type [valid-type] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/management/test_management_base_cmd.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -744,40 +714,81 @@ src/documents/tests/management/test_management_base_cmd.py:0: error: Missing typ src/documents/tests/management/test_management_base_cmd.py:0: error: Need type annotation for "result" [var-annotated] src/documents/tests/management/test_management_base_cmd.py:0: error: Need type annotation for "result" (hint: "result: list[] = ...") [var-annotated] src/documents/tests/management/test_management_base_cmd.py:0: error: Need type annotation for "results" [var-annotated] -src/documents/tests/management/test_management_sanity_checker.py:0: error: "DocumentFactory" has no attribute "source_path"; maybe "storage_path"? [attr-defined] -src/documents/tests/management/test_management_sanity_checker.py:0: error: "DocumentFactory" has no attribute "thumbnail_path" [attr-defined] +src/documents/tests/search/test_acceptance.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/search/test_acceptance.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/search/test_backend.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/search/test_cjk_clause.py:0: error: Argument 1 to "_build_cjk_query" has incompatible type "None"; expected "Index" [arg-type] +src/documents/tests/search/test_cjk_clause.py:0: error: Argument 1 to "_parse_cjk_text" has incompatible type "_RaisingIndex"; expected "Index" [arg-type] +src/documents/tests/search/test_cjk_clause.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] +src/documents/tests/search/test_cjk_emit_registry.py:0: error: "None" not callable [misc] +src/documents/tests/search/test_cjk_emit_registry.py:0: error: "SearchResult" has no attribute "count" [attr-defined] +src/documents/tests/search/test_cjk_leaf_rewrite.py:0: error: "None" not callable [misc] +src/documents/tests/search/test_cjk_widening.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] +src/documents/tests/search/test_date_keyword_timezone.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] +src/documents/tests/search/test_fuzzy_scoring.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Argument 1 has incompatible type "*tuple[object, ...]"; expected "Node" [arg-type] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Argument 2 has incompatible type "**dict[str, object]"; expected "Callable[[Term | Phrase], Node] | None" [arg-type] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Argument 2 has incompatible type "**dict[str, object]"; expected "FieldRegistry" [arg-type] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Argument 2 has incompatible type "**dict[str, object]"; expected "Index" [arg-type] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Argument 2 has incompatible type "**dict[str, object]"; expected "Node" [arg-type] +src/documents/tests/search/test_fuzzy_widening.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/search/test_negated_leaf_ids.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/search/test_permission_field_isolation.py:0: error: Argument 1 to "grant_object" has incompatible type "Group | None"; expected "User | Group" [arg-type] src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] +src/documents/tests/search/test_query.py:0: error: "SearchResult" has no attribute "count" [attr-defined] +src/documents/tests/search/test_query.py:0: error: Argument 2 to "build_permission_filter" has incompatible type "AbstractBaseUser"; expected "AbstractUser" [arg-type] +src/documents/tests/search/test_query.py:0: error: Argument 2 to "build_permission_filter" has incompatible type "AbstractBaseUser"; expected "AbstractUser" [arg-type] +src/documents/tests/search/test_query.py:0: error: Argument 2 to "build_permission_filter" has incompatible type "AbstractBaseUser"; expected "AbstractUser" [arg-type] +src/documents/tests/search/test_query.py:0: error: Argument 2 to "build_permission_filter" has incompatible type "AbstractBaseUser"; expected "AbstractUser" [arg-type] +src/documents/tests/search/test_query.py:0: error: Argument 2 to "build_permission_filter" has incompatible type "AbstractBaseUser"; expected "AbstractUser" [arg-type] +src/documents/tests/search/test_query.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_query.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/search/test_query.py:0: error: Unexpected attribute "pk" for model "AbstractBaseUser" [misc] src/documents/tests/search/test_query.py:0: error: Unexpected attribute "pk" for model "AbstractBaseUser" [misc] src/documents/tests/search/test_query.py:0: error: Unexpected attribute "pk" for model "AbstractBaseUser" [misc] src/documents/tests/search/test_query.py:0: error: Unexpected attribute "pk" for model "AbstractBaseUser" [misc] src/documents/tests/search/test_query.py:0: error: Unexpected attribute "pk" for model "AbstractBaseUser" [misc] +src/documents/tests/search/test_schema.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | None]" [index] +src/documents/tests/search/test_schema.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/tests/search/test_schema.py:0: error: Value expression in dictionary comprehension has incompatible type "str | Any"; expected type "dict[Any, Any]" [misc] +src/documents/tests/search/test_schema_fingerprint.py:0: error: Argument 1 to "update" of "MutableMapping" has incompatible type "dict[str, object]"; expected "SupportsKeysAndGetItem[str, str | int | None]" [arg-type] +src/documents/tests/search/test_schema_fingerprint.py:0: error: Incompatible return value type (got "str | Any", expected "list[dict[Any, Any]]") [return-value] +src/documents/tests/search/test_schema_fingerprint.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | None]" [index] +src/documents/tests/search/test_schema_fingerprint.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/tests/search/test_schema_fingerprint.py:0: error: Module "pytest_django.fixtures" has no attribute "SettingsWrapper" [attr-defined] src/documents/tests/search/test_tokenizer.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_tokenizer.py:0: error: "SearchResult" has no attribute "count" [attr-defined] src/documents/tests/search/test_tokenizer.py:0: error: "SearchResult" has no attribute "count" [attr-defined] -src/documents/tests/test_admin.py:0: error: "None" has no attribute "searcher" [attr-defined] +src/documents/tests/search/test_tokenizer.py:0: error: "SearchResult" has no attribute "count" [attr-defined] +src/documents/tests/search/test_widen_leaf.py:0: error: Argument "child" to "Boosted" has incompatible type "Node | None"; expected "Node" [arg-type] +src/documents/tests/search/test_widen_leaf.py:0: error: Argument "children" to "Or" has incompatible type "tuple[Term, Node | None]"; expected "tuple[Node, ...]" [arg-type] +src/documents/tests/search/test_widen_leaf.py:0: error: Argument "children" to "Or" has incompatible type "tuple[Term, Node | None]"; expected "tuple[Node, ...]" [arg-type] +src/documents/tests/search/test_widen_leaf.py:0: error: Argument "children" to "Or" has incompatible type "tuple[Term, Node | None]"; expected "tuple[Node, ...]" [arg-type] src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] -src/documents/tests/test_admin.py:0: error: Argument 1 to "range_query" of "Query" has incompatible type "None"; expected "Schema" [arg-type] src/documents/tests/test_admin.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_admin.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_admin.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] src/documents/tests/test_api_app_config.py:0: error: "ImageFile" has no attribute "text" [attr-defined] +src/documents/tests/test_api_app_config.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_app_config.py:0: error: List item 0 has incompatible type "tuple[str, dict[str, int], bytes]"; expected "tuple[str, int | list[int] | str, bytes]" [list-item] +src/documents/tests/test_api_app_config.py:0: error: List item 1 has incompatible type "tuple[str, dict[str, None], bytes]"; expected "tuple[str, int | list[int] | str, bytes]" [list-item] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_bulk_download.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] src/documents/tests/test_api_bulk_download.py:0: error: Value of type variable "_StrPathT" of "copy" cannot be "Path | None" [type-var] src/documents/tests/test_api_bulk_edit.py:0: error: "type[MatchingModel]" has no attribute "objects" [attr-defined] src/documents/tests/test_api_bulk_edit.py:0: error: "type[MatchingModel]" has no attribute "objects" [attr-defined] @@ -816,13 +827,49 @@ src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type a src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_bulk_edit.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_api_chat.py:0: error: "_MonkeyPatchedResponse" has no attribute "streaming_content" [attr-defined] src/documents/tests/test_api_custom_fields.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_document_versions.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_document_versions.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_document_versions.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_document_versions.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_document_versions.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] src/documents/tests/test_api_documents.py:0: error: "None" object is not iterable [misc] src/documents/tests/test_api_documents.py:0: error: "object" has no attribute "get" [attr-defined] src/documents/tests/test_api_documents.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 1 to "assertCountEqual" of "TestCase" has incompatible type "list[int] | None"; expected "Iterable[Any]" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedResponse"; expected "StreamingHttpResponse" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 2 to "assertNotIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 2 to "assertNotIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_api_documents.py:0: error: Argument 3 to "generic" of "APIClient" has incompatible type "bytes"; expected "str" [arg-type] @@ -830,6 +877,7 @@ src/documents/tests/test_api_documents.py:0: error: Function is missing a type a src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_documents.py:0: error: Item "None" of "SavedViewFilterRule | None" has no attribute "value" [union-attr] src/documents/tests/test_api_documents.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/tests/test_api_documents.py:0: error: Value of type "Any | None" is not indexable [index] @@ -851,6 +899,9 @@ src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Missing type a src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Need type annotation for "documents" (hint: "documents: list[] = ...") [var-annotated] src/documents/tests/test_api_objects.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_objects.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_objects.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] +src/documents/tests/test_api_objects.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] +src/documents/tests/test_api_objects.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "get_perms" has incompatible type "Tag | None"; expected "Model" [arg-type] src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "get_perms" has incompatible type "Tag | None"; expected "Model" [arg-type] src/documents/tests/test_api_permissions.py:0: error: Argument 2 to "has_perm" of "ObjectPermissionChecker" has incompatible type "Tag | None"; expected "Model" [arg-type] @@ -861,6 +912,7 @@ src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None" has no attribute "owner" [union-attr] src/documents/tests/test_api_permissions.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_api_permissions.py:0: error: Skipping analyzing "allauth.mfa.totp.internal": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_api_post_document_nfc.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] @@ -898,10 +950,17 @@ src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] +src/documents/tests/test_api_schema.py:0: error: Value of type "SchemaGenerator" is not indexable [index] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_search.py:0: error: Need type annotation for "seen_ids" (hint: "seen_ids: list[] = ...") [var-annotated] src/documents/tests/test_api_search.py:0: error: Unsupported left operand type for < ("None") [operator] src/documents/tests/test_api_search.py:0: error: Unsupported operand types for < ("int" and "None") [operator] @@ -912,30 +971,25 @@ src/documents/tests/test_api_status.py:0: error: Function is missing a type anno src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "DocumentFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "id" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: "PaperlessTaskFactory" has no attribute "pk" [attr-defined] -src/documents/tests/test_api_tasks.py:0: error: Argument 2 to "get" of "APIClient" has incompatible type "dict[str, Faker]"; expected "Mapping[str, str | bytes | float | Iterable[str | bytes | float]] | Iterable[tuple[str, str | bytes | float | Iterable[str | bytes | float]]] | None" [arg-type] -src/documents/tests/test_api_tasks.py:0: error: Argument 3 to "assign_perm" has incompatible type "DocumentFactory"; expected "Model | None" [arg-type] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Need type annotation for "ping_response" [var-annotated] src/documents/tests/test_api_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_uisettings.py:0: error: Argument 1 to "assertDictEqual" of "TestCase" has incompatible type "Any | None"; expected "Mapping[Any, object]" [arg-type] +src/documents/tests/test_api_workflows.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_workflows.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_api_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_api_workflows.py:0: error: Item "None" of "Correspondent | None" has no attribute "pk" [union-attr] +src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowAction | None" has no attribute "ai_create_missing" [union-attr] +src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowAction | None" has no attribute "ai_overwrite_existing" [union-attr] +src/documents/tests/test_api_workflows.py:0: error: Item "None" of "WorkflowAction | None" has no attribute "ai_suggestion_fields" [union-attr] +src/documents/tests/test_api_workflows.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/test_barcodes.py:0: error: "GetReaderPluginMixin" has no attribute "dirs" [attr-defined] src/documents/tests/test_barcodes.py:0: error: Argument 1 to "contextmanager" has incompatible type "Callable[[TestAsnBarcode, Path], BarcodePlugin]"; expected "Callable[[TestAsnBarcode, Path], Iterator[Never]]" [arg-type] src/documents/tests/test_barcodes.py:0: error: Argument 1 to "contextmanager" has incompatible type "Callable[[TestTagBarcode, Path], BarcodePlugin]"; expected "Callable[[TestTagBarcode, Path], Iterator[Never]]" [arg-type] src/documents/tests/test_barcodes.py:0: error: Argument 1 to "get_reader" of "GetReaderPluginMixin" has incompatible type "str"; expected "Path" [arg-type] -src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] -src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] -src/documents/tests/test_barcodes.py:0: error: Argument 3 to "BarcodePlugin" has incompatible type "DummyProgressManager"; expected "ProgressManager" [arg-type] src/documents/tests/test_barcodes.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] @@ -963,6 +1017,7 @@ src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" has incompatible type "int"; expected "StoragePath" [arg-type] src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" has incompatible type "int"; expected "StoragePath" [arg-type] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -993,20 +1048,29 @@ src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annot src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] src/documents/tests/test_bulk_edit.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] +src/documents/tests/test_bulk_edit.py:0: error: Item "dict[Any, Any]" of "Group | dict[Any, Any]" has no attribute "count" [union-attr] +src/documents/tests/test_bulk_edit.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_bulk_edit.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_bulk_edit.py:0: error: Too few arguments for "count" of "list" [call-arg] -src/documents/tests/test_caching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_classifier.py:0: error: "None" has no attribute "classes_" [attr-defined] src/documents/tests/test_classifier.py:0: error: "None" has no attribute "classes_" [attr-defined] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "classes_" [attr-defined] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "transform" [attr-defined] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "transform" [attr-defined] src/documents/tests/test_classifier.py:0: error: "None" has no attribute "transform" [attr-defined] src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] -src/documents/tests/test_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1014,6 +1078,8 @@ src/documents/tests/test_classifier.py:0: error: Function is missing a type anno src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Incompatible types in assignment (expression has type "Mock", variable has type "None") [assignment] src/documents/tests/test_classifier.py:0: error: Invalid base class "real_catch_warnings" [misc] src/documents/tests/test_classifier.py:0: error: Module "sklearn.exceptions" has no attribute "InconsistentVersionWarning" [attr-defined] src/documents/tests/test_classifier.py:0: error: Variable "real_catch_warnings" is not valid as a type [valid-type] @@ -1071,12 +1137,30 @@ src/documents/tests/test_consumer.py:0: error: Item "None" of "DocumentType | No src/documents/tests/test_consumer.py:0: error: Item "None" of "StoragePath | None" has no attribute "id" [union-attr] src/documents/tests/test_consumer.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/test_consumer.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "current_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "current_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "max_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "max_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "status" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentUpdatedData" has no key "status" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "current_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "current_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "max_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "max_progress" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "status" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: TypedDict "DocumentsDeletedData" has no key "status" [typeddict-item] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/test_consumer.py:0: error: Unused "type: ignore" comment [unused-ignore] src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_consumer_archive.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_document_list_effective_content_annotation.py:0: error: Incompatible types in assignment (expression has type "SimpleNamespace", variable has type "Request") [assignment] +src/documents/tests/test_document_list_effective_content_annotation.py:0: error: Incompatible types in assignment (expression has type "SimpleNamespace", variable has type "Request") [assignment] src/documents/tests/test_double_sided.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_double_sided.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_double_sided.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1114,6 +1198,15 @@ src/documents/tests/test_file_handling.py:0: error: Function is missing a type a src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_file_handling.py:0: error: Item "None" of "Path | None" has no attribute "write_bytes" [union-attr] src/documents/tests/test_file_handling.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_filepath_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/tests/test_filters.py:0: error: Argument 1 to "localize_date" has incompatible type "list[object] | dict[Any, Any] | Literal[1698330605] | None"; expected "date | datetime | str" [arg-type] src/documents/tests/test_management.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_management.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "Path | None"; expected "PathLike[str] | str" [arg-type] @@ -1135,56 +1228,104 @@ src/documents/tests/test_management_exporter.py:0: error: Item "None" of "MailAc src/documents/tests/test_management_exporter.py:0: error: Item "None" of "Path | None" has no attribute "read_bytes" [union-attr] src/documents/tests/test_management_exporter.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_management_fuzzy.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_management_retagger.py:0: error: "DocumentFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_management_retagger.py:0: error: "DocumentFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_management_retagger.py:0: error: "DocumentFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_management_retagger.py:0: error: "DocumentFactory" has no attribute "tags" [attr-defined] -src/documents/tests/test_management_retagger.py:0: error: "DocumentFactory" has no attribute "tags" [attr-defined] +src/documents/tests/test_management_importer.py:0: error: "Model" has no attribute "correspondent_id" [attr-defined] +src/documents/tests/test_management_importer.py:0: error: "Model" has no attribute "correspondent_id" [attr-defined] +src/documents/tests/test_management_importer.py:0: error: "Model" has no attribute "name" [attr-defined] +src/documents/tests/test_management_importer.py:0: error: Item "None" of "Tag | None" has no attribute "name" [union-attr] +src/documents/tests/test_management_importer.py:0: error: Item "None" of "Tag | None" has no attribute "name" [union-attr] src/documents/tests/test_management_retagger.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_management_retagger.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_management_retagger.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_management_retagger.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_management_retagger.py:0: error: Incompatible return value type (got "tuple[CorrespondentFactory, CorrespondentFactory]", expected "tuple[Correspondent, Correspondent]") [return-value] -src/documents/tests/test_management_retagger.py:0: error: Incompatible return value type (got "tuple[DocumentFactory, DocumentFactory, DocumentFactory, DocumentFactory]", expected "tuple[Document, Document, Document, Document]") [return-value] -src/documents/tests/test_management_retagger.py:0: error: Incompatible return value type (got "tuple[DocumentTypeFactory, DocumentTypeFactory]", expected "tuple[DocumentType, DocumentType]") [return-value] -src/documents/tests/test_management_retagger.py:0: error: Incompatible return value type (got "tuple[StoragePathFactory, StoragePathFactory, StoragePathFactory]", expected "tuple[StoragePath, StoragePath, StoragePath]") [return-value] -src/documents/tests/test_management_retagger.py:0: error: Incompatible return value type (got "tuple[TagFactory, TagFactory, TagFactory, TagFactory, TagFactory]", expected "tuple[Tag, Tag, Tag, Tag, Tag]") [return-value] src/documents/tests/test_management_superuser.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Cannot determine type of "apps" [has-type] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_matchables.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_merge_documents_as_versions.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/tests/test_migration_saved_view_visibility.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_migration_saved_view_visibility.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] src/documents/tests/test_migration_sha256_checksums.py:0: error: "_fixture_teardown" undefined in superclass [misc] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Cannot determine type of "apps" [has-type] src/documents/tests/test_migration_sha256_checksums.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_sha256_checksums.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] src/documents/tests/test_migration_share_link_bundle.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_migration_share_link_bundle.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] src/documents/tests/test_models.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] src/documents/tests/test_models.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] src/documents/tests/test_parsers.py:0: error: "None" not callable [misc] +src/documents/tests/test_permission_filtering_security.py:0: error: Argument "classifier" to "match_correspondents" has incompatible type "None"; expected "DocumentClassifier" [arg-type] +src/documents/tests/test_permission_filtering_security.py:0: error: Argument "classifier" to "match_document_types" has incompatible type "None"; expected "DocumentClassifier" [arg-type] +src/documents/tests/test_permission_filtering_security.py:0: error: Argument "classifier" to "match_storage_paths" has incompatible type "None"; expected "DocumentClassifier" [arg-type] +src/documents/tests/test_permission_filtering_security.py:0: error: Argument "classifier" to "match_tags" has incompatible type "None"; expected "DocumentClassifier" [arg-type] +src/documents/tests/test_permission_filtering_security.py:0: error: Argument 1 to "permitted_document_ids" has incompatible type "AnonymousUser"; expected "User | None" [arg-type] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_permission_filtering_security.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/tests/test_permitted_objects_filter.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permitted_objects_filter.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permitted_objects_filter.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permitted_objects_filter.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_permitted_objects_filter.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_regex.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_regex.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_sanity_check.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] @@ -1192,37 +1333,29 @@ src/documents/tests/test_share_link_bundles.py:0: error: "_MonkeyPatchedResponse src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_share_link_bundles.py:0: error: Item "None" of "Path | None" has no attribute "resolve" [union-attr] +src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Argument 2 to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | float | Iterable[str | bytes | float]] | Iterable[tuple[str, str | bytes | float | Iterable[str | bytes | float]]] | None" [arg-type] src/documents/tests/test_tag_hierarchy.py:0: error: Need type annotation for "context" (hint: "context: dict[, ] = ...") [var-annotated] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_done" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_done" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "date_started" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "duration_seconds" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "refresh_from_db" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: "PaperlessTaskFactory" has no attribute "wait_time_seconds" [attr-defined] src/documents/tests/test_task_signals.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_task_signals.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/test_task_signals.py:0: error: Incompatible return value type (got "PaperlessTaskFactory", expected "PaperlessTask") [return-value] src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/tests/test_task_signals.py:0: error: Missing type arguments for generic type "tuple" [type-arg] src/documents/tests/test_task_signals.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] src/documents/tests/test_task_signals.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] -src/documents/tests/test_task_signals.py:0: error: Unsupported right operand type for in ("None") [operator] -src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] -src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] -src/documents/tests/test_task_signals.py:0: error: Value of type "None" is not indexable [index] +src/documents/tests/test_task_signals.py:0: error: Unsupported right operand type for in ("Any | None") [operator] +src/documents/tests/test_task_signals.py:0: error: Value of type "Any | None" is not indexable [index] +src/documents/tests/test_task_signals.py:0: error: Value of type "Any | None" is not indexable [index] +src/documents/tests/test_task_signals.py:0: error: Value of type "Any | None" is not indexable [index] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1231,6 +1364,22 @@ src/documents/tests/test_tasks.py:0: error: Function is missing a type annotatio src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "render" [attr-defined] src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "render" [attr-defined] src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] +src/documents/tests/test_views.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedWSGIResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_views.py:0: error: Argument 1 to "read_streaming_response" has incompatible type "_MonkeyPatchedWSGIResponse"; expected "StreamingHttpResponse" [arg-type] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1240,7 +1389,8 @@ src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfigura src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] src/documents/tests/test_views.py:0: error: Item "None" of "SuggestionCacheData | None" has no attribute "suggestions" [union-attr] -src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_views.py:0: error: Item "None" of "SuggestionCacheData | None" has no attribute "suggestions" [union-attr] +src/documents/tests/test_views.py:0: error: Item "None" of "SuggestionCacheData | None" has no attribute "suggestions" [union-attr] src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] @@ -1257,21 +1407,23 @@ src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" o src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] -src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Any | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "Path | str"; expected "Path" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "list" has incompatible type "Group | dict[Any, Any]"; expected "Iterable[Any]" [arg-type] @@ -1283,6 +1435,8 @@ src/documents/tests/test_workflows.py:0: error: Argument 1 to "list" has incompa src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] src/documents/tests/test_workflows.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] @@ -1312,6 +1466,13 @@ src/documents/tests/test_workflows.py:0: error: Function is missing a type annot src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Any | list[str]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Any | list[str]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] @@ -1322,13 +1483,20 @@ src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] src/documents/tests/test_workflows.py:0: error: Incompatible types in assignment (expression has type "Group | dict[Any, Any]", variable has type "QuerySet[Any, Any]") [assignment] +src/documents/tests/test_workflows.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "Correspondent | None" has no attribute "owner" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "DocumentType | None" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "DocumentType | None" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "DocumentType | None" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "None" of "DocumentType | None" has no attribute "owner" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "headers" [union-attr] src/documents/tests/test_workflows.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] -src/documents/tests/test_workflows.py:0: error: Item "str" of "Any | str" has no attribute "name" [union-attr] +src/documents/tests/test_workflows.py:0: error: Item "str" of "Path | str" has no attribute "name" [union-attr] src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] src/documents/tests/test_workflows.py:0: error: Name "group_perms" already defined on line 0 [no-redef] @@ -1344,82 +1512,27 @@ src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] src/documents/tests/test_workflows.py:0: error: Too few arguments for "count" of "list" [call-arg] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertEqual"; maybe "assertFilesEqual"? [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertEqual"; maybe "assertFilesEqual"? [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertFalse"; maybe "assertIsFile"? [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertFalse"; maybe "assertIsFile"? [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] -src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] -src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] -src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] -src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] -src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "consumption_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "consumption_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "scratch_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "scratch_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "settings_override" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "settings_override" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "static_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "static_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] -src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] -src/documents/tests/utils.py:0: error: Cannot determine type of "apps" [has-type] -src/documents/tests/utils.py:0: error: First argument to namedtuple() should be "dirs", not "Dirs" [name-match] -src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a type annotation [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/documents/tests/utils.py:0: error: Item "None" of "AppConfig | None" has no attribute "name" [union-attr] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "Callable" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "list" [type-arg] -src/documents/tests/utils.py:0: error: Missing type arguments for generic type "tuple" [type-arg] -src/documents/tests/utils.py:0: error: Need type annotation for "payloads" (hint: "payloads: list[] = ...") [var-annotated] +src/documents/tests/utils.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/utils.py:0: error: Unused "type: ignore" comment [unused-ignore] +src/documents/tests/utils.py:0: error: Unused "type: ignore" comment [unused-ignore] src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "float | int") [assignment] src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "float | int", variable has type "int | None") [assignment] src/documents/utils.py:0: error: Missing type arguments for generic type "CompletedProcess" [type-arg] src/documents/validators.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/documents/versioning.py:0: error: Missing type arguments for generic type "Prefetch" [type-arg] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "filter_queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "get_queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] -src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "request" [attr-defined] +src/documents/views.py:0: error: "Sequence[_SupportsHasPermission]" has no attribute "append" [attr-defined] src/documents/views.py:0: error: "get_serializer_context" undefined in superclass [misc] src/documents/views.py:0: error: "object" has no attribute "apply_async" [attr-defined] +src/documents/views.py:0: error: "type[DocumentFilterSet]" has no attribute "declared_filters" [attr-defined] src/documents/views.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] src/documents/views.py:0: error: Argument "filename" to "FileResponse" has incompatible type "str | Any | None"; expected "str" [arg-type] src/documents/views.py:0: error: Argument "path" to "EmailAttachment" has incompatible type "Path | None"; expected "Path" [arg-type] @@ -1427,16 +1540,18 @@ src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] -src/documents/views.py:0: error: Argument 1 to "TaskSummarySerializer" has incompatible type "QuerySet[PaperlessTask@AnnotatedWith[TypedDict({'total_count': int, 'pending_count': int, 'success_count': int, 'failure_count': int, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})], dict[str, Any]]"; expected "dict[str, Any] | None" [arg-type] -src/documents/views.py:0: error: Argument 1 to "get_objects_for_user_owner_aware" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] -src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] -src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] -src/documents/views.py:0: error: Argument 1 to "paginate_queryset" of "GenericAPIView" has incompatible type "TantivyRelevanceList"; expected "QuerySet[Any, Any]" [arg-type] +src/documents/views.py:0: error: Argument 1 to "TaskSummarySerializer" has incompatible type "QuerySet[PaperlessTask@AnnotatedWith[TypedDict({'total_count': int, 'pending_count': int, 'success_count': int, 'failure_count': int, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})], TypedDict({'task_type': str, 'total_count': Any, 'pending_count': Any, 'success_count': Any, 'failure_count': Any, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})]"; expected "dict[str, Any] | None" [arg-type] +src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/documents/views.py:0: error: Argument 1 to "paginate_queryset" of "GenericAPIView" has incompatible type "TantivyRelevanceList"; expected "QuerySet[Any, _MT_co] | Sequence[_MT_co]" [arg-type] +src/documents/views.py:0: error: Argument 1 to "permitted_document_ids" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] +src/documents/views.py:0: error: Argument 1 to "permitted_object_ids" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_correspondents" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_document_types" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_storage_paths" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_tags" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] -src/documents/views.py:0: error: Argument 3 to "autocomplete" of "TantivyBackend" has incompatible type "User | AnonymousUser | None"; expected "AbstractBaseUser | None" [arg-type] +src/documents/views.py:0: error: Argument 3 to "autocomplete" of "TantivyBackend" has incompatible type "User | AnonymousUser | None"; expected "AbstractUser | None" [arg-type] +src/documents/views.py:0: error: Dict entry 0 has incompatible type "str": "bool"; expected "str": "str" [dict-item] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -1452,6 +1567,15 @@ src/documents/views.py:0: error: Function is missing a return type annotation [ src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1522,8 +1646,8 @@ src/documents/views.py:0: error: Function is missing a type annotation for one o src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "dict[Any, Any]") [assignment] -src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Any]") [assignment] -src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Document]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "ClassificationSuggestions", variable has type "dict[Any, Any]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Document, Document]", variable has type "list[Any]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] @@ -1535,7 +1659,7 @@ src/documents/views.py:0: error: Incompatible types in assignment (expression ha src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] -src/documents/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated], type[ViewDocumentsPermissions]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[ArchiveOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[DocumentSerializer]", variable has type "type[TrashSerializer]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[OriginalsOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] @@ -1547,19 +1671,22 @@ src/documents/views.py:0: error: Item "None" of "Any | None" has no attribute "g src/documents/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "get_page_size" [union-attr] src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "page_size" [union-attr] -src/documents/views.py:0: error: Item "None" of "dict[str, _PingReply] | None" has no attribute "keys" [union-attr] src/documents/views.py:0: error: Missing positional argument "request" in call to "email_documents" [call-arg] src/documents/views.py:0: error: Missing type arguments for generic type "GenericViewSet" [type-arg] src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Need type annotation for "authentication_classes" (hint: "authentication_classes: list[] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "children_map" (hint: "children_map: dict[, ] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "doc" [var-annotated] +src/documents/views.py:0: error: Need type annotation for "doc" [var-annotated] src/documents/views.py:0: error: Need type annotation for "docs" (hint: "docs: list[] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "permission_classes" (hint: "permission_classes: list[] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "ui_settings" (hint: "ui_settings: dict[, ] = ...") [var-annotated] +src/documents/views.py:0: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "list[object]" [call-overload] src/documents/views.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/views.py:0: error: Skipping analyzing "langdetect": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/documents/views.py:0: error: TypedDict key must be a string literal; expected one of ("pk", "correspondent", "document_type", "storage_path", "tags", ...) [literal-required] src/documents/views.py:0: error: Unsupported operand types for + ("None" and "int") [operator] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] @@ -1572,7 +1699,6 @@ src/documents/views.py:0: error: Value of type "Iterable[CustomField]" is not in src/documents/views.py:0: error: Value of type "Iterable[Group]" is not indexable [index] src/documents/views.py:0: error: Value of type "Iterable[User]" is not indexable [index] src/documents/views.py:0: error: Value of type "Iterable[Workflow]" is not indexable [index] -src/documents/views.py:0: error: Value of type "dict[str, _PingReply] | None" is not indexable [index] src/documents/workflows/actions.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1613,6 +1739,8 @@ src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebho src/documents/workflows/actions.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/workflows/actions.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/workflows/actions.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/documents/workflows/ai.py:0: error: "type[ObjT]" has no attribute "objects" [attr-defined] +src/documents/workflows/ai.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_groups"; maybe "assign_change_groups"? [attr-defined] src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_groups"; maybe "assign_change_groups"? [attr-defined] src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_users"; maybe "assign_change_users"? [attr-defined] @@ -1654,7 +1782,6 @@ src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" h src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "float | tuple[float | None, float | None, float | None, float | None] | Timeout | None | UseClientDefault" [arg-type] src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "tuple[str | bytes, str | bytes] | Callable[[Request], Request] | Auth | UseClientDefault" [arg-type] src/documents/workflows/webhooks.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/documents/workflows/webhooks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/workflows/webhooks.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/workflows/webhooks.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/workflows/webhooks.py:0: error: Missing type arguments for generic type "dict" [type-arg] @@ -1690,7 +1817,7 @@ src/paperless/auth.py:0: error: No return value expected [return-value] src/paperless/auth.py:0: error: Return type "None" of "__call__" incompatible with return type "HttpResponseBase | Awaitable[HttpResponseBase]" in supertype "django.contrib.auth.middleware.RemoteUserMiddleware" [override] src/paperless/auth.py:0: error: Skipping analyzing "allauth.mfa.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/celery.py:0: error: Argument 2 to "register" has incompatible type "Callable[[object], bytes]"; expected "Callable[[Any], str] | None" [arg-type] -src/paperless/celery.py:0: error: Argument 3 to "register" has incompatible type "Callable[[bytes], object]"; expected "Callable[[str], Any] | None" [arg-type] +src/paperless/celery.py:0: error: Argument 3 to "register" has incompatible type "Callable[[bytes], Any]"; expected "Callable[[str], Any] | None" [arg-type] src/paperless/celery.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/checks.py:0: error: Argument 1 to "append" of "list" has incompatible type "Error"; expected "Warning" [arg-type] src/paperless/checks.py:0: error: Argument 2 to "path_check" has incompatible type "Path | None"; expected "Path" [arg-type] @@ -1712,16 +1839,21 @@ src/paperless/config.py:0: error: Incompatible types in assignment (expression h src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ArchiveFileGenerationChoices") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "CleanChoices") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ColorConvertChoices") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "ModeChoices") [assignment] src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "OutputTypeChoices") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "RemoteOCRMode") [assignment] src/paperless/consumers.py:0: error: Argument 1 to "_can_view" of "StatusConsumer" has incompatible type "DocumentUpdatedData"; expected "PermissionsData" [arg-type] src/paperless/consumers.py:0: error: Argument 1 to "_can_view" of "StatusConsumer" has incompatible type "ProgressUpdateData"; expected "PermissionsData" [arg-type] src/paperless/consumers.py:0: error: Item "AbstractBaseUser" of "AbstractBaseUser | AnonymousUser" has no attribute "groups" [union-attr] src/paperless/consumers.py:0: error: Item "AbstractBaseUser" of "AbstractBaseUser | AnonymousUser" has no attribute "id" [union-attr] src/paperless/consumers.py:0: error: Item "AbstractBaseUser" of "AbstractBaseUser | AnonymousUser" has no attribute "is_superuser" [union-attr] +src/paperless/consumers.py:0: error: Missing type arguments for generic type "Task" [type-arg] src/paperless/consumers.py:0: error: Unsupported operand types for in ("Any | None" and "list[int]") [operator] src/paperless/db_cache.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/db_cache.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1729,24 +1861,37 @@ src/paperless/db_cache.py:0: error: Skipping analyzing "cachalot.api": module is src/paperless/db_cache.py:0: error: Skipping analyzing "cachalot.utils": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/middleware.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/middleware.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/middleware.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/middleware.py:0: error: Skipping analyzing "compression_middleware.middleware": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/middleware.py:0: error: Value of type "Collection[str]" is not indexable [index] src/paperless/migrations/0001_initial.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/migrations/0007_optimize_integer_field_sizes.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/migrations/0008_replace_skip_archive_file.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/migrations/0016_alter_applicationconfiguration_ai_enabled.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/network.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/network.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/network.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/network.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/network.py:0: error: Incompatible return value type (got "list[str | int]", expected "list[str]") [return-value] +src/paperless/parsers/remote.py:0: error: Incompatible types in assignment (expression has type "BufferedWriter[_BufferedWriterStream]", variable has type "BufferedReader[_BufferedReaderStream]") [assignment] +src/paperless/parsers/remote.py:0: error: Missing type arguments for generic type "PipelineRequest" [type-arg] src/paperless/parsers/tesseract.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/parsers/tesseract.py:0: error: Skipping analyzing "img2pdf": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless/parsers/utils.py:0: error: No overload variant of "get" of "Object" matches argument types "str", "bool" [call-overload] src/paperless/serialisers.py:0: error: "PasswordValidationMixin" has no attribute "instance" [attr-defined] -src/paperless/serialisers.py:0: error: "UploadedFile" has no attribute "field_name" [attr-defined] +src/paperless/serialisers.py:0: error: "UploadedFile[Any]" has no attribute "field_name" [attr-defined] src/paperless/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/serialisers.py:0: error: Item "None" of "str | None" has no attribute "replace" [union-attr] +src/paperless/serialisers.py:0: error: Missing type arguments for generic type "UploadedFile" [type-arg] +src/paperless/serialisers.py:0: error: Missing type arguments for generic type "UploadedFile" [type-arg] src/paperless/serialisers.py:0: error: Need type annotation for "auth_token" [var-annotated] src/paperless/serialisers.py:0: error: Signature of "run_validation" incompatible with supertype "rest_framework.fields.Field" [override] src/paperless/serialisers.py:0: error: Skipping analyzing "allauth.mfa.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -1760,11 +1905,9 @@ src/paperless/settings/__init__.py:0: error: Argument 1 to "parse_ignore_dates" src/paperless/settings/__init__.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/settings/__init__.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/settings/__init__.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/settings/__init__.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/settings/__init__.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/settings/__init__.py:0: error: Incompatible types in assignment (expression has type "bool", variable has type "str") [assignment] src/paperless/settings/__init__.py:0: error: Incompatible types in assignment (expression has type "dict[str, object]", target has type "str") [assignment] -src/paperless/settings/__init__.py:0: error: Skipping analyzing "compression_middleware.middleware": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/settings/custom.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/settings/custom.py:0: error: No overload variant of "getenv" matches argument types "Collection[str]", "Collection[str]" [call-overload] src/paperless/settings/custom.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[str, str]]" [dict-item] @@ -1774,6 +1917,7 @@ src/paperless/settings/parsers.py:0: error: Missing type arguments for generic t src/paperless/settings/parsers.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless/signals.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/signed_pickle.py:0: error: Item "None" of "str | None" has no attribute "encode" [union-attr] src/paperless/tests/parsers/conftest.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/parsers/conftest.py:0: error: Incompatible return value type (got "def _make_parser(**django_settings_overrides: Any) -> _GeneratorContextManager[Any, None, None]", expected "Callable[..., Generator[RasterisedDocumentParser, None, None]]") [return-value] src/paperless/tests/parsers/test_convert_image_to_pdfa.py:0: error: Skipping analyzing "img2pdf": module is installed, but missing library stubs or py.typed marker [import-untyped] @@ -1810,13 +1954,6 @@ src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[Raster src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__exit__"; maybe "__next__"? [attr-defined] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__exit__"; maybe "__next__"? [attr-defined] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: "Generator[RasterisedDocumentParser, None, None]" has no attribute "__exit__"; maybe "__next__"? [attr-defined] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] -src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "assert_ordered_substrings" has incompatible type "str | None"; expected "str" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "calculate_a4_dpi" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Argument 1 to "get_dpi" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] src/paperless/tests/parsers/test_tesseract_parser.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1851,14 +1988,27 @@ src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is m src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/settings/test_environment_parsers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/settings/test_remote_user.py:0: error: Unsupported target for indexed assignment ("Collection[str]") [index] +src/paperless/tests/settings/test_settings.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/settings/test_settings.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Cannot assign to a method [method-assign] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.account.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.core": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/tests/test_adapter.py:0: error: Skipping analyzing "allauth.socialaccount.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless/tests/test_celery.py:0: error: Value of type "object" is not indexable [index] -src/paperless/tests/test_celery.py:0: error: Value of type "object" is not indexable [index] +src/paperless/tests/test_admin_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_admin_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_admin_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_admin_auth.py:0: error: Skipping analyzing "allauth.mfa": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/tests/test_admin_auth.py:0: error: Skipping analyzing "allauth.mfa.totp.internal": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/tests/test_api_auth.py:0: error: "Callable[..., Any]" has no attribute "view_class" [attr-defined] +src/paperless/tests/test_api_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_api_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_api_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_api_auth.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_auth_middleware.py:0: error: Argument 1 to "AutoLoginMiddleware" has incompatible type "Callable[[Any], None]"; expected "_AnyGetResponseCallable" [arg-type] +src/paperless/tests/test_auth_middleware.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_checks.py:0: error: Generator has incompatible item type "str | None"; expected "str" [misc] src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for in ("str | None") [operator] src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for in ("str | None") [operator] @@ -1866,13 +2016,16 @@ src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for in ("str | None") [operator] src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for in ("str | None") [operator] src/paperless/tests/test_checks.py:0: error: Unsupported right operand type for in ("str | None") [operator] +src/paperless/tests/test_compression_middleware.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_logging.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_logging.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Cannot determine type of "apps" [has-type] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] -src/paperless/tests/test_migration_replace_skip_archive_file.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/paperless/tests/test_network.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_network.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_network.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_network.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_network.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_ocr_config.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_ocr_config.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -1903,6 +2056,8 @@ src/paperless/tests/test_registry.py:0: error: Function is missing a return type src/paperless/tests/test_registry.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_registry.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1917,18 +2072,30 @@ src/paperless/tests/test_registry.py:0: error: Function is missing a type annota src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/test_registry.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless/tests/test_remote_ocr_config.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/tests/test_signals.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/paperless/tests/test_signals.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/paperless/tests/test_utils.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "streaming_content" [attr-defined] src/paperless/urls.py:0: error: Argument 2 to "path" has incompatible type "_ASGIApplicationProtocol"; expected "Callable[..., HttpResponseBase]" [arg-type] +src/paperless/urls.py:0: error: Cannot assign to a method [method-assign] src/paperless/urls.py:0: error: Skipping analyzing "allauth.account": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/urls.py:0: error: Skipping analyzing "allauth.account.decorators": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/urls.py:0: error: Skipping analyzing "allauth.mfa.base": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/urls.py:0: error: Skipping analyzing "allauth.socialaccount": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/urls.py:0: error: Skipping analyzing "allauth.urls": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/validators.py:0: error: Argument 1 to "join" of "str" has incompatible type "Iterator[str | bytes] | Any"; expected "Iterable[str]" [arg-type] src/paperless/validators.py:0: error: Incompatible types in assignment (expression has type "str | bytes", variable has type "str") [assignment] -src/paperless/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/paperless/validators.py:0: error: Missing type arguments for generic type "UploadedFile" [type-arg] +src/paperless/validators.py:0: error: Missing type arguments for generic type "UploadedFile" [type-arg] +src/paperless/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] src/paperless/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -1947,12 +2114,16 @@ src/paperless/views.py:0: error: Function is missing a type annotation [no-unty src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless/views.py:0: error: Incompatible type for "user" of "Token" (got "User | AnonymousUser", expected "User | Combinable") [misc] src/paperless/views.py:0: error: Incompatible type for lookup 'user': (got "User | AnonymousUser", expected "User | int | None") [misc] src/paperless/views.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "socialaccount_set" [union-attr] -src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "ai_enabled" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_context_size" [union-attr] src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_backend" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_chunk_size" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_endpoint" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_model" [union-attr] src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] @@ -1969,18 +2140,34 @@ src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.recovery_codes. src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.totp.internal": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/views.py:0: error: Skipping analyzing "allauth.socialaccount.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] src/paperless/views.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless_ai/ai_classifier.py:0: error: Argument 1 to "parse_ai_response" has incompatible type "str"; expected "dict[Any, Any]" [arg-type] +src/paperless_ai/ai_classifier.py:0: error: Argument 1 to "parse_ai_response" has incompatible type "ClassificationSuggestions"; expected "dict[Any, Any]" [arg-type] +src/paperless_ai/ai_classifier.py:0: error: Argument 1 to "parse_ai_response" has incompatible type "ClassificationSuggestions"; expected "dict[Any, Any]" [arg-type] +src/paperless_ai/ai_classifier.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "str") [assignment] src/paperless_ai/ai_classifier.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless_ai/ai_classifier.py:0: error: Missing type arguments for generic type "dict" [type-arg] +src/paperless_ai/ai_classifier.py:0: error: TypedDict key must be a string literal; expected one of ("correspondents", "dates", "document_types", "storage_paths", "tags", ...) [literal-required] +src/paperless_ai/ai_classifier.py:0: error: TypedDict key must be a string literal; expected one of ("correspondents", "dates", "document_types", "storage_paths", "tags", ...) [literal-required] +src/paperless_ai/ai_classifier.py:0: error: TypedDict key must be a string literal; expected one of ("correspondents", "dates", "document_types", "storage_paths", "tags", ...) [literal-required] +src/paperless_ai/base_model.py:0: error: Invalid index type "str | None" for "dict[str, FieldInfo]"; expected type "str" [index] +src/paperless_ai/chat.py:0: error: Dict entry 1 has incompatible type "str": "str | Any | None"; expected "str": "int | str" [dict-item] +src/paperless_ai/chat.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/chat.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/chat.py:0: error: Item "AsyncGenerator[str, None]" of "Any | Generator[str, None, None] | AsyncGenerator[str, None]" has no attribute "__iter__" (not iterable) [union-attr] src/paperless_ai/chat.py:0: error: Item "Response" of "Response | StreamingResponse | AsyncStreamingResponse | PydanticResponse" has no attribute "response_gen" [union-attr] -src/paperless_ai/client.py:0: error: Incompatible return value type (got "dict[str, Any]", expected "str") [return-value] +src/paperless_ai/chat.py:0: error: Missing type arguments for generic type "list" [type-arg] src/paperless_ai/client.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] -src/paperless_ai/indexing.py:0: error: Argument "persist_dir" to "from_defaults" of "StorageContext" has incompatible type "Path"; expected "str | None" [arg-type] -src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "FaissVectorStore" has incompatible type "Path"; expected "str" [arg-type] -src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "SimpleDocumentStore" has incompatible type "Path"; expected "str" [arg-type] -src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "SimpleIndexStore" has incompatible type "Path"; expected "str" [arg-type] +src/paperless_ai/client.py:0: error: Skipping analyzing "llama_index.llms.ollama": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/client.py:0: error: Skipping analyzing "llama_index.llms.openai_like": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/db.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/embedding.py:0: error: No overload variant of "get" of "dict" matches argument type "str" [call-overload] +src/paperless_ai/embedding.py:0: error: Skipping analyzing "llama_index.embeddings.huggingface": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/embedding.py:0: error: Skipping analyzing "llama_index.embeddings.ollama": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/embedding.py:0: error: Skipping analyzing "llama_index.embeddings.openai_like": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -1988,12 +2175,25 @@ src/paperless_ai/indexing.py:0: error: Function is missing a return type annotat src/paperless_ai/indexing.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/indexing.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/indexing.py:0: error: Skipping analyzing "faiss": module is installed, but missing library stubs or py.typed marker [import-untyped] -src/paperless_ai/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless_ai/matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/matching.py:0: error: "type[ModelT]" has no attribute "objects" [attr-defined] +src/paperless_ai/matching.py:0: error: "type[ModelT]" has no attribute "objects" [attr-defined] src/paperless_ai/matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_ai/matching.py:0: error: Missing type arguments for generic type "list" [type-arg] -src/paperless_ai/tests/conftest.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/taxonomy.py:0: error: "object" has no attribute "__iter__"; maybe "__dir__" or "__str__"? (not iterable) [attr-defined] +src/paperless_ai/taxonomy.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] +src/paperless_ai/tests/conftest.py:0: error: Incompatible return value type (got "FakeEmbedding", expected "MagicMock | AsyncMock | NonCallableMagicMock") [return-value] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Argument "candidates" to "build_prompt_without_rag" has incompatible type "dict[str, list[Any]]"; expected "TaxonomyCandidates | None" [arg-type] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Argument "candidates" to "build_prompt_without_rag" has incompatible type "dict[str, list[dict[str, object]]]"; expected "TaxonomyCandidates | None" [arg-type] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Argument 1 to "build_localization_prompt" has incompatible type "dict[str, Collection[str]]"; expected "ClassificationSuggestions" [arg-type] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -2003,25 +2203,34 @@ src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a typ src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_ai_indexing.py:0: error: Return type "list[float]" of "_aget_query_embedding" incompatible with return type "Coroutine[Any, Any, list[float]]" in supertype "llama_index.core.base.embeddings.base.BaseEmbedding" [override] -src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Need type annotation for "empty_candidates" [var-annotated] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_base_model.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_ai/tests/test_client.py:0: error: Function is missing a return type annotation [no-untyped-def] @@ -2033,7 +2242,14 @@ src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annot src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_ai/tests/test_client.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | None]" [index] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] @@ -2045,25 +2261,75 @@ src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type an src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_correspondents_by_name" has incompatible type "None"; expected "User" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_document_types_by_name" has incompatible type "None"; expected "User" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_storage_paths_by_name" has incompatible type "None"; expected "User" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_ai/tests/test_matching.py:0: error: Argument 1 to "match_tags_by_name" has incompatible type "list[str | None]"; expected "list[str]" [arg-type] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Missing type arguments for generic type "DjangoModelFactory" [type-arg] +src/paperless_ai/tests/test_matching.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/paperless_ai/tests/test_vector_store.py:0: error: Argument 2 to "_query" has incompatible type "list[float] | None"; expected "list[float]" [arg-type] +src/paperless_ai/tests/test_vector_store.py:0: error: Argument 2 to "make_node" has incompatible type "str"; expected "int" [arg-type] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_ai/tests/test_vector_store.py:0: error: Skipping analyzing "sqlite_vec": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/vector_store.py:0: error: Argument 1 to "int" has incompatible type "int | float | str | list[str] | list[float] | list[int] | None"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/paperless_ai/vector_store.py:0: error: Argument 1 to "int" has incompatible type "int | float | str | list[str] | list[float] | list[int] | None"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/paperless_ai/vector_store.py:0: error: Argument 1 to "int" has incompatible type "str | Any | None"; expected "str | Buffer | SupportsInt | SupportsIndex" [arg-type] +src/paperless_ai/vector_store.py:0: error: Skipping analyzing "sqlite_vec": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/vector_store.py:0: error: Unexpected keyword argument "flat_metadata" for "__init__" of "BasePydanticVectorStore" [call-arg] src/paperless_mail/admin.py:0: error: Missing type arguments for generic type "ModelAdmin" [type-arg] src/paperless_mail/admin.py:0: error: Missing type arguments for generic type "ModelForm" [type-arg] src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] +src/paperless_mail/mail.py:0: error: "PinnedClientMixin" has no attribute "_host" [attr-defined] +src/paperless_mail/mail.py:0: error: "PinnedClientMixin" has no attribute "_port" [attr-defined] +src/paperless_mail/mail.py:0: error: "PinnedClientMixin" has no attribute "_timeout" [attr-defined] +src/paperless_mail/mail.py:0: error: "_create_socket" undefined in superclass [misc] src/paperless_mail/mail.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] src/paperless_mail/mail.py:0: error: Argument 1 to "TagMailAction" has incompatible type "str | None"; expected "str" [arg-type] src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "Header | list[Header] | None" [arg-type] @@ -2089,6 +2355,8 @@ src/paperless_mail/mail.py:0: error: Function is missing a return type annotatio src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -2096,11 +2364,13 @@ src/paperless_mail/mail.py:0: error: Function is missing a type annotation for o src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/mail.py:0: error: Incompatible return value type (got "MailBoxUnencrypted", expected "MailBox") [return-value] -src/paperless_mail/mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] -src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "MailBox", variable has type "MailBoxUnencrypted") [assignment] -src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "MailBoxStartTls", variable has type "MailBoxUnencrypted") [assignment] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/mail.py:0: error: Incompatible return value type (got "PinnedMailBoxUnencrypted", expected "MailBox") [return-value] src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str") [assignment] +src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "PinnedMailBox", variable has type "PinnedMailBoxUnencrypted") [assignment] +src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "PinnedMailBoxStartTls", variable has type "PinnedMailBoxUnencrypted") [assignment] src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] @@ -2108,6 +2378,8 @@ src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expressio src/paperless_mail/mail.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/paperless_mail/mail.py:0: error: Missing type arguments for generic type "list" [type-arg] src/paperless_mail/management/commands/mail_fetcher.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/migrations/0002_optimize_integer_field_sizes.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/migrations/0002_optimize_integer_field_sizes.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/models.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/models.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/oauth.py:0: error: Argument "refresh_token" to "refresh_token" of "BaseOAuth2" has incompatible type "str | None"; expected "str" [arg-type] @@ -2131,105 +2403,78 @@ src/paperless_mail/serialisers.py:0: error: Function is missing a type annotatio src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/conftest.py:0: error: "MailAccountFactory" has no attribute "delete" [attr-defined] -src/paperless_mail/tests/conftest.py:0: error: Incompatible types in "yield" (actual type "MailAccountFactory", expected type "MailAccount") [misc] -src/paperless_mail/tests/test_api.py:0: error: "CorrespondentFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "DocumentTypeFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_attachment_filename_include" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_body" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_from" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_subject" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "filter_to" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "MailRuleFactory" has no attribute "refresh_from_db" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "ProcessedMailFactory" has no attribute "id"; maybe "uid"? [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: "TagFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailAccountFactory"; expected "Model | None" [arg-type] -src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailAccountFactory"; expected "Model | None" [arg-type] -src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "MailRuleFactory"; expected "Model | None" [arg-type] -src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "ProcessedMailFactory"; expected "Model | None" [arg-type] -src/paperless_mail/tests/test_api.py:0: error: Argument 3 to "assign_perm" has incompatible type "ProcessedMailFactory"; expected "Model | None" [arg-type] +src/paperless_mail/tasks.py:0: error: Missing type arguments for generic type "Task" [type-arg] +src/paperless_mail/tests/helpers.py:0: error: "MailMessage" has no attribute "flagged" [attr-defined] +src/paperless_mail/tests/helpers.py:0: error: "MailMessage" has no attribute "seen" [attr-defined] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "MailboxFolderSelectError" has incompatible type "None"; expected "tuple[Any, ...]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/helpers.py:0: error: Missing type arguments for generic type "AbstractContextManager" [type-arg] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "BogusFolderManager" has no attribute "list" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "CorrespondentFactory" has no attribute "id" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "CorrespondentFactory" has no attribute "id" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailAccountFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "flagged" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "flagged" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "seen" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailMessage" has no attribute "seen" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "action_parameter" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "MailRuleFactory" has no attribute "pk" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[att@486]" has no attribute "filename" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message2@432]" has no attribute "from_values" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@425]" has no attribute "from_" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@425]" has no attribute "from_values" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@484]" has no attribute "subject" [attr-defined] -src/paperless_mail/tests/test_mail.py:0: error: "type[message@537]" has no attribute "attachments" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[att]" has no attribute "filename" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message]" has no attribute "subject" [attr-defined] src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxFolderSelectError" has incompatible type "None"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxFolderSelectError" has incompatible type "None"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "MailboxLoginError" has incompatible type "str"; expected "tuple[Any, ...]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@432]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2@432]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message@425]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message@484]"; expected "MailMessage" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "filter" has incompatible type "Callable[[Any], bool]"; expected "Callable[[MailMessage], TypeGuard[Never]]" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] -src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att@486]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message2]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_correspondent" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 1 to "_get_title" of "MailAccountHandler" has incompatible type "type[message]"; expected "MailMessage" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att]"; expected "MailAttachment" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "_get_title" of "MailAccountHandler" has incompatible type "type[att]"; expected "MailAttachment" [arg-type] src/paperless_mail/tests/test_mail.py:0: error: Argument 2 to "assertIn" of "TestCase" has incompatible type "str | None"; expected "Iterable[Any] | Container[Any]" [arg-type] +src/paperless_mail/tests/test_mail.py:0: error: Cannot assign to a method [method-assign] +src/paperless_mail/tests/test_mail.py:0: error: Cannot assign to a method [method-assign] src/paperless_mail/tests/test_mail.py:0: error: Dict entry 0 has incompatible type "str": "None"; expected "str": "str" [dict-item] src/paperless_mail/tests/test_mail.py:0: error: Dict entry 0 has incompatible type "str": "int"; expected "str": "str" [dict-item] src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "att", not "Attachment" [name-match] src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] -src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message2", not "MailMessage" [name-match] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] @@ -2246,23 +2491,10 @@ src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annot src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "assign_correspondent" of "MailRule" (got "CorrespondentFactory", expected "Correspondent | Combinable | None") [misc] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[MailMessage]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] -src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "id" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "id" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "match" [union-attr] @@ -2270,19 +2502,31 @@ src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "name" [union-attr] -src/paperless_mail/tests/test_mail.py:0: error: Missing type arguments for generic type "AbstractContextManager" [type-arg] +src/paperless_mail/tests/test_mail.py:0: error: List item 0 has incompatible type "str | None"; expected "str" [list-item] src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_mail_nfc.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] src/paperless_mail/tests/test_mail_oauth.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] -src/paperless_mail/tests/test_mail_oauth.py:0: error: Argument 1 to "handle_mail_account" of "MailAccountHandler" has incompatible type "MailAccountFactory"; expected "MailAccount" [arg-type] src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/paperless_mail/tests/test_mail_oauth.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] +src/paperless_mail/tests/test_migrations.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/tests/test_migrations.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/tests/test_preprocessor.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] @@ -2294,11 +2538,17 @@ src/paperless_mail/tests/test_preprocessor.py:0: error: "type[TestMailMessageGpg src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/tests/test_preprocessor.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_mail/tests/test_preprocessor.py:0: error: Incompatible type for "account" of "MailRule" (got "MailAccountFactory", expected "MailAccount | Combinable | None") [misc] src/paperless_mail/tests/test_preprocessor.py:0: error: Skipping analyzing "gnupg": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_mail/tests/test_process_mail_accounts_overlap.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a return type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] src/paperless_mail/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] +src/paperless_testing/http.py:0: error: Argument 1 to "join" of "bytes" has incompatible type "Iterator[bytes] | AsyncIterator[bytes]"; expected "Iterable[Buffer]" [arg-type] +src/paperless_testing/migrations.py:0: error: Item "None" of "AppConfig | None" has no attribute "name" [union-attr] +src/paperless_testing/retry.py:0: error: Missing type arguments for generic type "Callable" [type-arg] +src/paperless_testing/retry.py:0: error: Missing type arguments for generic type "list" [type-arg] +src/paperless_testing/retry.py:0: error: Missing type arguments for generic type "tuple" [type-arg] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 727d2c410..d037198ab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,7 +38,7 @@ repos: - json # See https://github.com/prettier/prettier/issues/15742 for the fork reason - repo: https://github.com/rbubley/mirrors-prettier - rev: 'v3.9.6' + rev: 'v3.9.9' hooks: - id: prettier types_or: @@ -46,16 +46,16 @@ repos: - ts - markdown additional_dependencies: - - prettier@3.9.6 + - prettier@3.9.9 - 'prettier-plugin-organize-imports@4.3.0' # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.16.5 + rev: v0.16.9 hooks: - id: ruff-check - id: ruff-format - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.28.1" + rev: "v2.29.4" hooks: - id: pyproject-fmt additional_dependencies: [tomli] diff --git a/.pyrefly-baseline.json b/.pyrefly-baseline.json index 87578462d..9305cfe00 100644 --- a/.pyrefly-baseline.json +++ b/.pyrefly-baseline.json @@ -1,14560 +1,6423 @@ { "errors": [ { - "line": 94, "column": 5, - "stop_line": 94, - "stop_column": 31, "path": "src/documents/admin.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `FunctionType` has no attribute `short_description`", "concise_description": "Object of class `FunctionType` has no attribute `short_description`", "severity": "error" }, { - "line": 255, "column": 27, - "stop_line": 255, - "stop_column": 35, "path": "src/documents/admin.py", - "code": -2, "name": "unbound-name", - "description": "`LogEntry` may be uninitialized", "concise_description": "`LogEntry` may be uninitialized", "severity": "error" }, { - "line": 269, - "column": 16, - "stop_line": 269, - "stop_column": 24, - "path": "src/documents/barcodes.py", - "code": -2, - "name": "missing-import", - "description": "Cannot find module `zxingcpp`\n Looked in these locations (from config in `/home/trenton/projects/paperless-ngx/pyproject.toml`):\n Search path (from config file): [\"/home/trenton/projects/paperless-ngx/src\"]\n Import root (inferred from project layout): \"/home/trenton/projects/paperless-ngx/src\"\n Site package path queried from interpreter: [\"/home/trenton/projects/paperless-ngx/.venv/lib/python3.13/site-packages\"]", - "concise_description": "Cannot find module `zxingcpp`", - "severity": "error" - }, - { - "line": 325, "column": 38, - "stop_line": 325, - "stop_column": 51, "path": "src/documents/barcodes.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `Image` has no attribute `filename`", "concise_description": "Object of class `Image` has no attribute `filename`", "severity": "error" }, { - "line": 277, - "column": 16, - "stop_line": 277, - "stop_column": 23, - "path": "src/documents/bulk_edit.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `Literal['ERROR']` is not assignable to declared return type `Literal['OK']`", - "concise_description": "Returned type `Literal['ERROR']` is not assignable to declared return type `Literal['OK']`", + "column": 9, + "path": "src/documents/bulk_download.py", + "name": "bad-override", + "concise_description": "Class member `OriginalsOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/bulk_download.py", + "name": "bad-override", + "concise_description": "Class member `ArchiveOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/bulk_download.py", + "name": "bad-override", + "concise_description": "Class member `OriginalAndArchiveStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", "severity": "error" }, { - "line": 291, "column": 9, - "stop_line": 293, - "stop_column": 60, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "bad-assignment", - "description": "`dict_items[Unknown, Unknown] | list[tuple[int, None]]` is not assignable to variable `add_custom_fields` with type `dict[Unknown, Unknown] | list[int]`", - "concise_description": "`dict_items[Unknown, Unknown] | list[tuple[int, None]]` is not assignable to variable `add_custom_fields` with type `dict[Unknown, Unknown] | list[int]`", + "concise_description": "`list[tuple[int, Unknown]] | list[tuple[int, None]]` is not assignable to variable `add_custom_fields` with type `dict[Unknown, Unknown] | list[int]`", "severity": "error" }, { - "line": 297, - "column": 32, - "stop_line": 297, - "stop_column": 40, + "column": 23, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "not-iterable", - "description": "Type `int` is not iterable", "concise_description": "Type `int` is not iterable", "severity": "error" }, { - "line": 299, "column": 9, - "stop_line": 299, - "stop_column": 24, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "not-iterable", - "description": "Type `int` is not iterable", "concise_description": "Type `int` is not iterable", "severity": "error" }, { - "line": 305, - "column": 21, - "stop_line": 305, - "stop_column": 43, + "column": 13, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "bad-index", - "description": "Cannot index into `dict[CustomField.FieldDataType, str]`\n Argument `str` is not assignable to parameter `key` with type `CustomField.FieldDataType` in function `dict.__getitem__`", "concise_description": "Cannot index into `dict[CustomField.FieldDataType, str]`", "severity": "error" }, { - "line": 341, "column": 5, - "stop_line": 344, - "stop_column": 18, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `QuerySet` has no attribute `hard_delete`", "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", "severity": "error" }, { - "line": 724, + "column": 59, + "path": "src/documents/bulk_edit.py", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `transaction_id` in function `django.db.models.query.QuerySet.delete`", + "severity": "error" + }, + { + "column": 57, + "path": "src/documents/bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[int]` is not assignable to parameter `args` with type `tuple[Any, ...] | None` in function `celery.app.task.Task.apply_async`", + "severity": "error" + }, + { "column": 33, - "stop_line": 724, - "stop_column": 63, "path": "src/documents/bulk_edit.py", - "code": -2, "name": "missing-argument", - "description": "Missing argument `p` in function `pikepdf._core.PageList.remove`", "concise_description": "Missing argument `p` in function `pikepdf._core.PageList.remove`", "severity": "error" }, { - "line": 1032, - "column": 13, - "stop_line": 1032, - "stop_column": 64, - "path": "src/documents/bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `append`", - "concise_description": "Object of class `NoneType` has no attribute `append`", - "severity": "error" - }, - { - "line": 180, "column": 25, - "stop_line": 180, - "stop_column": 55, "path": "src/documents/caching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `binascii.hexlify`\n Protocol `Buffer` requires attribute `__buffer__`", "concise_description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `binascii.hexlify`", "severity": "error" }, { - "line": 144, + "column": 13, + "path": "src/documents/classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `MLPClassifier` has no attribute `_optimizer`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `MLPClassifier` has no attribute `_best_coefs`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `MLPClassifier` has no attribute `_best_intercepts`", + "severity": "error" + }, + { "column": 40, - "stop_line": 144, - "stop_column": 66, "path": "src/documents/classifier.py", - "code": -2, "name": "missing-module-attribute", - "description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", "concise_description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", "severity": "error" }, { - "line": 341, + "column": 17, + "path": "src/documents/classifier.py", + "name": "unsupported-operation", + "concise_description": "`>=` is not supported between `datetime` and `None`", + "severity": "error" + }, + { "column": 36, - "stop_line": 343, - "stop_column": 10, "path": "src/documents/classifier.py", - "code": -2, "name": "bad-assignment", - "description": "`ndarray | spmatrix` is not assignable to `ndarray`", "concise_description": "`ndarray | spmatrix` is not assignable to `ndarray`", "severity": "error" }, { - "line": 348, "column": 44, - "stop_line": 348, - "stop_column": 48, "path": "src/documents/classifier.py", - "code": -2, "name": "bad-assignment", - "description": "`None` is not assignable to attribute `stop_words_` with type `set[Unknown]`", "concise_description": "`None` is not assignable to attribute `stop_words_` with type `set[Unknown]`", "severity": "error" }, { - "line": 362, "column": 51, - "stop_line": 364, - "stop_column": 24, "path": "src/documents/classifier.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `spmatrix` has no attribute `ravel`", "concise_description": "Object of class `spmatrix` has no attribute `ravel`", "severity": "error" }, { - "line": 367, "column": 42, - "stop_line": 367, - "stop_column": 88, "path": "src/documents/classifier.py", - "code": -2, "name": "bad-assignment", - "description": "`ndarray | spmatrix` is not assignable to variable `labels_tags_vectorized` with type `ndarray`", "concise_description": "`ndarray | spmatrix` is not assignable to variable `labels_tags_vectorized` with type `ndarray`", "severity": "error" }, { - "line": 466, - "column": 18, - "stop_line": 466, - "stop_column": 42, + "column": 17, "path": "src/documents/classifier.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `str` and `None`", - "concise_description": "`in` is not supported between `str` and `None`", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `sample_weight` in function `sklearn.neural_network._multilayer_perceptron.BaseMultilayerPerceptron.fit`", "severity": "error" }, { - "line": 472, - "column": 26, - "stop_line": 472, - "stop_column": 44, + "column": 17, "path": "src/documents/classifier.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `stem`", - "concise_description": "Object of class `NoneType` has no attribute `stem`", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `sample_weight` in function `sklearn.neural_network._multilayer_perceptron.BaseMultilayerPerceptron.fit`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/classifier.py", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `sample_weight` in function `sklearn.neural_network._multilayer_perceptron.BaseMultilayerPerceptron.fit`", "severity": "error" }, { - "line": 529, "column": 22, - "stop_line": 529, - "stop_column": 52, "path": "src/documents/classifier.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `transform`", "concise_description": "Object of class `NoneType` has no attribute `transform`", "severity": "error" }, { - "line": 564, + "column": 26, + "path": "src/documents/classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `transform`", + "severity": "error" + }, + { "column": 24, - "stop_line": 564, - "stop_column": 61, "path": "src/documents/classifier.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `inverse_transform`", "concise_description": "Object of class `NoneType` has no attribute `inverse_transform`", "severity": "error" }, { - "line": 79, "column": 9, - "stop_line": 79, - "stop_column": 23, "path": "src/documents/consumer.py", - "code": -2, "name": "not-iterable", - "description": "Type `None` is not iterable", "concise_description": "Type `None` is not iterable", "severity": "error" }, { - "line": 207, "column": 26, - "stop_line": 207, - "stop_column": 35, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-count", - "description": "Expected 0 positional arguments, got 5 in function `object.__init__`", "concise_description": "Expected 0 positional arguments, got 5 in function `object.__init__`", "severity": "error" }, { - "line": 209, "column": 9, - "stop_line": 209, - "stop_column": 33, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `renew_logging_group`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `renew_logging_group`", "severity": "error" }, { - "line": 211, "column": 25, - "stop_line": 211, - "stop_column": 38, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 211, "column": 51, - "stop_line": 211, - "stop_column": 65, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `input_doc`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `input_doc`", "severity": "error" }, { - "line": 221, "column": 9, - "stop_line": 221, - "stop_column": 24, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `status_mgr`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `status_mgr`", "severity": "error" }, { - "line": 227, "column": 22, - "stop_line": 227, - "stop_column": 35, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 227, "column": 48, - "stop_line": 227, - "stop_column": 61, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 228, "column": 29, - "stop_line": 228, - "stop_column": 42, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 229, "column": 16, - "stop_line": 229, - "stop_column": 29, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 230, "column": 30, - "stop_line": 230, - "stop_column": 43, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 231, "column": 16, - "stop_line": 231, - "stop_column": 29, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", "severity": "error" }, { - "line": 328, "column": 17, - "stop_line": 328, - "stop_column": 25, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "concise_description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 397, "column": 17, - "stop_line": 397, - "stop_column": 25, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "concise_description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 408, "column": 9, - "stop_line": 408, - "stop_column": 12, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-override", - "description": "Class member `ConsumerPlugin.run` overrides parent class `AlwaysRunPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `AlwaysRunPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `AlwaysRunPluginMixin` in an inconsistent manner", "severity": "error" }, { - "line": 408, "column": 9, - "stop_line": 408, - "stop_column": 12, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-override", - "description": "Class member `ConsumerPlugin.run` overrides parent class `NoSetupPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `NoSetupPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `NoSetupPluginMixin` in an inconsistent manner", "severity": "error" }, { - "line": 408, "column": 9, - "stop_line": 408, - "stop_column": 12, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-override", - "description": "Class member `ConsumerPlugin.run` overrides parent class `NoCleanupPluginMixin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `NoCleanupPluginMixin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `NoCleanupPluginMixin` in an inconsistent manner", "severity": "error" }, { - "line": 408, "column": 9, - "stop_line": 408, - "stop_column": 12, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-override", - "description": "Class member `ConsumerPlugin.run` overrides parent class `ConsumeTaskPlugin` in an inconsistent manner\n `ConsumerPlugin.run` has type `(self: ConsumerPlugin) -> ConsumeFileSuccessResult`, which is not assignable to `(self: ConsumerPlugin) -> str | None`, the type of `ConsumeTaskPlugin.run`\n Signature mismatch:\n expected: def run(self: ConsumerPlugin) -> str | None: ...\n ^^^^^^^^^^ return type\n found: def run(self: ConsumerPlugin) -> ConsumeFileSuccessResult: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^ return type", "concise_description": "Class member `ConsumerPlugin.run` overrides parent class `ConsumeTaskPlugin` in an inconsistent manner", "severity": "error" }, { - "line": 442, "column": 25, - "stop_line": 446, - "stop_column": 26, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 447, "column": 32, - "stop_line": 447, - "stop_column": 40, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "concise_description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 518, "column": 25, - "stop_line": 518, - "stop_column": 33, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `log` with type `Logger | None` in function `should_produce_archive`", "concise_description": "Argument `LoggerAdapter[Logger]` is not assignable to parameter `log` with type `Logger | None` in function `should_produce_archive`", "severity": "error" }, { - "line": 548, - "column": 74, - "stop_line": 548, - "stop_column": 78, - "path": "src/documents/consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", - "severity": "error" - }, - { - "line": 630, - "column": 33, - "stop_line": 630, - "stop_column": 60, - "path": "src/documents/consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 645, - "column": 38, - "stop_line": 645, - "stop_column": 42, - "path": "src/documents/consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `text` with type `str` in function `ConsumerPlugin._store`", - "concise_description": "Argument `str | None` is not assignable to parameter `text` with type `str` in function `ConsumerPlugin._store`", - "severity": "error" - }, - { - "line": 716, - "column": 62, - "stop_line": 716, - "stop_column": 83, - "path": "src/documents/consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "severity": "error" - }, - { - "line": 723, - "column": 37, - "stop_line": 723, - "stop_column": 58, - "path": "src/documents/consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.utils.compute_checksum`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.utils.compute_checksum`", - "severity": "error" - }, - { - "line": 807, "column": 13, - "stop_line": 807, - "stop_column": 31, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `correspondent_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "concise_description": "Argument `str | None` is not assignable to parameter `correspondent_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "severity": "error" }, { - "line": 808, "column": 13, - "stop_line": 808, - "stop_column": 26, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `doc_type_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "concise_description": "Argument `str | None` is not assignable to parameter `doc_type_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "severity": "error" }, { - "line": 809, "column": 13, - "stop_line": 809, - "stop_column": 27, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `owner_username` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "concise_description": "Argument `str | None` is not assignable to parameter `owner_username` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", "severity": "error" }, { - "line": 931, "column": 31, - "stop_line": 931, - "stop_column": 46, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", "severity": "error" }, { - "line": 1003, "column": 21, - "stop_line": 1003, - "stop_column": 36, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `title`", "concise_description": "Object of class `NoneType` has no attribute `title`", "severity": "error" }, { - "line": 1004, "column": 24, - "stop_line": 1004, - "stop_column": 51, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `original_filename`", "concise_description": "Object of class `NoneType` has no attribute `original_filename`", "severity": "error" }, { - "line": 1005, "column": 30, - "stop_line": 1005, - "stop_column": 48, "path": "src/documents/consumer.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 1005, "column": 58, - "stop_line": 1005, - "stop_column": 76, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filename`", "concise_description": "Object of class `NoneType` has no attribute `filename`", "severity": "error" }, { - "line": 1006, "column": 28, - "stop_line": 1006, - "stop_column": 40, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", "concise_description": "Object of class `NoneType` has no attribute `pk`", "severity": "error" }, { - "line": 1013, "column": 65, - "stop_line": 1013, - "stop_column": 77, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", "concise_description": "Object of class `NoneType` has no attribute `pk`", "severity": "error" }, { - "line": 1028, "column": 21, - "stop_line": 1028, - "stop_column": 33, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", "concise_description": "Object of class `NoneType` has no attribute `pk`", "severity": "error" }, { - "line": 1094, "column": 16, - "stop_line": 1094, - "stop_column": 51, "path": "src/documents/consumer.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `deleted_at`", "concise_description": "Object of class `NoneType` has no attribute `deleted_at`", "severity": "error" }, { - "line": 31, "column": 13, - "stop_line": 37, - "stop_column": 14, "path": "src/documents/converters.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", - "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str | Any]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 46, "column": 24, - "stop_line": 46, - "stop_column": 49, "path": "src/documents/converters.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `bytes | None` is not assignable to parameter `buffer` with type `Buffer` in function `_io.BufferedWriter.write`\n Protocol `Buffer` requires attribute `__buffer__`", "concise_description": "Argument `bytes | None` is not assignable to parameter `buffer` with type `Buffer` in function `_io.BufferedWriter.write`", "severity": "error" }, { - "line": 116, "column": 13, - "stop_line": 119, - "stop_column": 26, "path": "src/documents/data_models.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `values_list`", "concise_description": "Object of class `list` has no attribute `values_list`", "severity": "error" }, { - "line": 122, "column": 13, - "stop_line": 125, - "stop_column": 26, "path": "src/documents/data_models.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `values_list`", "concise_description": "Object of class `list` has no attribute `values_list`", "severity": "error" }, { - "line": 138, "column": 26, - "stop_line": 138, - "stop_column": 43, "path": "src/documents/data_models.py", - "code": -2, "name": "not-iterable", - "description": "Type `Group` is not iterable", "concise_description": "Type `Group` is not iterable", "severity": "error" }, { - "line": 139, "column": 35, - "stop_line": 139, - "stop_column": 59, "path": "src/documents/data_models.py", - "code": -2, "name": "bad-index", - "description": "Cannot index into `Group`\n Object of class `Group` has no attribute `__getitem__`", "concise_description": "Cannot index into `Group`", "severity": "error" }, { - "line": 143, "column": 26, - "stop_line": 143, - "stop_column": 43, "path": "src/documents/data_models.py", - "code": -2, "name": "not-iterable", - "description": "Type `Group` is not iterable", "concise_description": "Type `Group` is not iterable", "severity": "error" }, { - "line": 144, "column": 37, - "stop_line": 144, - "stop_column": 61, "path": "src/documents/data_models.py", - "code": -2, "name": "bad-index", - "description": "Cannot index into `Group`\n Object of class `Group` has no attribute `__getitem__`", "concise_description": "Cannot index into `Group`", "severity": "error" }, { - "line": 173, "column": 22, - "stop_line": 173, - "stop_column": 65, "path": "src/documents/data_models.py", - "code": -2, "name": "bad-assignment", - "description": "`None` is not assignable to `str`", "concise_description": "`None` is not assignable to `str`", "severity": "error" }, { - "line": 143, "column": 12, - "stop_line": 143, - "stop_column": 36, "path": "src/documents/file_handling.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `storage_path`", "concise_description": "Object of class `NoneType` has no attribute `storage_path`", "severity": "error" }, { - "line": 144, "column": 31, - "stop_line": 144, - "stop_column": 60, "path": "src/documents/file_handling.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `object` has no attribute `path`", "concise_description": "Object of class `object` has no attribute `path`", "severity": "error" }, { - "line": 157, "column": 53, - "stop_line": 157, - "stop_column": 64, "path": "src/documents/file_handling.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Document | None` is not assignable to parameter `document` with type `Document` in function `format_filename`", "concise_description": "Argument `Document | None` is not assignable to parameter `document` with type `Document` in function `format_filename`", "severity": "error" }, { - "line": 181, "column": 16, - "stop_line": 181, - "stop_column": 30, "path": "src/documents/file_handling.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", "concise_description": "Object of class `NoneType` has no attribute `pk`", "severity": "error" }, { - "line": 210, "column": 51, - "stop_line": 210, - "stop_column": 61, "path": "src/documents/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `SharedByUser` has no attribute `model`", "concise_description": "Object of class `SharedByUser` has no attribute `model`", "severity": "error" }, { - "line": 266, + "column": 21, + "path": "src/documents/filters.py", + "name": "bad-argument-type", + "concise_description": "Argument `QuerySet[Model, dict[str, Any]]` is not assignable to parameter `expression` with type `Combinable | str` in function `django.db.models.aggregates.Count.__init__`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/filters.py", + "name": "bad-argument-type", + "concise_description": "Argument `QuerySet[Model, dict[str, Any]]` is not assignable to parameter `expression` with type `Combinable | str` in function `django.db.models.aggregates.Count.__init__`", + "severity": "error" + }, + { "column": 31, - "stop_line": 266, - "stop_column": 51, "path": "src/documents/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", "concise_description": "Object of class `NoneType` has no attribute `get`", "severity": "error" }, { - "line": 326, "column": 25, - "stop_line": 326, - "stop_column": 66, "path": "src/documents/filters.py", - "code": -2, "name": "unsupported-operation", - "description": "`None` is not subscriptable", "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 353, - "column": 47, - "stop_line": 353, - "stop_column": 76, + "column": 48, "path": "src/documents/filters.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `dict[Unknown | None, _APIExceptionInput]` is not assignable to parameter `detail` with type `ErrorDetail | Mapping[str, _APIExceptionInput] | Sequence[_APIExceptionInput] | _StrPromise | dict[str, _Detail] | list[_Detail] | str | None` in function `rest_framework.exceptions.APIException.__init__`", - "concise_description": "Argument `dict[Unknown | None, _APIExceptionInput]` is not assignable to parameter `detail` with type `ErrorDetail | Mapping[str, _APIExceptionInput] | Sequence[_APIExceptionInput] | _StrPromise | dict[str, _Detail] | list[_Detail] | str | None` in function `rest_framework.exceptions.APIException.__init__`", + "name": "bad-assignment", + "concise_description": "`Unknown | None` is not assignable to dict key type `str`", "severity": "error" }, { - "line": 362, "column": 5, - "stop_line": 362, - "stop_column": 26, "path": "src/documents/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `FunctionType` has no attribute `__signature__`", "concise_description": "Object of class `FunctionType` has no attribute `__signature__`", "severity": "error" }, { - "line": 673, "column": 26, - "stop_line": 673, - "stop_column": 49, "path": "src/documents/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ForeignObjectRel` has no attribute `deconstruct`", "concise_description": "Object of class `ForeignObjectRel` has no attribute `deconstruct`", "severity": "error" }, { - "line": 676, "column": 17, - "stop_line": 676, - "stop_column": 28, "path": "src/documents/filters.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Field[Any, Any] | ForeignObjectRel` is not assignable to parameter `model_field` with type `Field[Unknown, Unknown]` in function `rest_framework.serializers.ModelSerializer.build_standard_field`", "concise_description": "Argument `Field[Any, Any] | ForeignObjectRel` is not assignable to parameter `model_field` with type `Field[Unknown, Unknown]` in function `rest_framework.serializers.ModelSerializer.build_standard_field`", "severity": "error" }, { - "line": 733, - "column": 18, - "stop_line": 733, - "stop_column": 41, - "path": "src/documents/filters.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `iterable` with type `Iterable[Any]` in function `set.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `iterable` with type `Iterable[Any]` in function `set.__init__`", - "severity": "error" - }, - { - "line": 1040, "column": 25, - "stop_line": 1040, - "stop_column": 45, "path": "src/documents/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", "concise_description": "Object of class `NoneType` has no attribute `get`", "severity": "error" }, { - "line": 13, "column": 31, - "stop_line": 13, - "stop_column": 48, "path": "src/documents/loggers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `LoggingMixin` has no attribute `logging_name`", "concise_description": "Object of class `LoggingMixin` has no attribute `logging_name`", "severity": "error" }, { - "line": 119, - "column": 13, - "stop_line": 119, - "stop_column": 29, - "path": "src/documents/management/commands/document_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `write`", - "concise_description": "Object of class `NoneType` has no attribute `write`", - "severity": "error" - }, - { - "line": 122, - "column": 9, - "stop_line": 122, - "stop_column": 25, - "path": "src/documents/management/commands/document_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `write`", - "concise_description": "Object of class `NoneType` has no attribute `write`", - "severity": "error" - }, - { - "line": 565, "column": 41, - "stop_line": 565, - "stop_column": 50, "path": "src/documents/management/commands/document_exporter.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | str` is not assignable to parameter `element` with type `str` in function `set.add`", "concise_description": "Argument `Path | str` is not assignable to parameter `element` with type `str` in function `set.add`", "severity": "error" }, { - "line": 238, "column": 14, - "stop_line": 238, - "stop_column": 18, "path": "src/documents/management/commands/document_importer.py", - "code": -2, "name": "bad-override-mutable-attribute", - "description": "Class member `Command.salt` overrides parent class `CryptMixin` in an inconsistent manner\n `Command.salt` has type `str | None`, which is not consistent with `str` in `CryptMixin.salt` (the type of read-write attributes cannot be changed)", "concise_description": "Class member `Command.salt` overrides parent class `CryptMixin` in an inconsistent manner", "severity": "error" }, { - "line": 420, - "column": 29, - "stop_line": 420, - "stop_column": 51, - "path": "src/documents/management/commands/document_importer.py", - "code": -2, - "name": "unsupported-operation", - "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "`/` is not supported between `Path` and `None`", - "severity": "error" - }, - { - "line": 463, - "column": 35, - "stop_line": 463, - "stop_column": 60, - "path": "src/documents/management/commands/document_importer.py", - "code": -2, - "name": "unsupported-operation", - "description": "`/` is not supported between `Path` and `None`\n Argument `None` is not assignable to parameter `key` with type `PathLike[str] | str` in function `pathlib.PurePath.__truediv__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "`/` is not supported between `Path` and `None`", - "severity": "error" - }, - { - "line": 49, "column": 42, - "stop_line": 49, - "stop_column": 69, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_correspondent`", "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_correspondent`", "severity": "error" }, { - "line": 81, "column": 42, - "stop_line": 81, - "stop_column": 69, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_document_type`", "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_document_type`", "severity": "error" }, { - "line": 112, "column": 33, - "stop_line": 112, - "stop_column": 60, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_tags`", "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_tags`", "severity": "error" }, { - "line": 139, "column": 41, - "stop_line": 139, - "stop_column": 68, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_storage_path`", "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `documents.classifier.DocumentClassifier.predict_storage_path`", "severity": "error" }, { - "line": 345, - "column": 24, - "stop_line": 348, - "stop_column": 10, - "path": "src/documents/matching.py", - "code": -2, - "name": "bad-specialization", - "description": "`Path` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "concise_description": "`Path` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", - "severity": "error" - }, - { - "line": 347, - "column": 13, - "stop_line": 347, - "stop_column": 32, - "path": "src/documents/matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `pat` with type `Path` in function `fnmatch.fnmatch`", - "concise_description": "Argument `str` is not assignable to parameter `pat` with type `Path` in function `fnmatch.fnmatch`", - "severity": "error" - }, - { - "line": 356, - "column": 12, - "stop_line": 356, - "stop_column": 37, - "path": "src/documents/matching.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[bool, Literal[''] | tuple[str]]` is not assignable to declared return type `tuple[bool, str]`", - "concise_description": "Returned type `tuple[bool, Literal[''] | tuple[str]]` is not assignable to declared return type `tuple[bool, str]`", - "severity": "error" - }, - { - "line": 370, "column": 9, - "stop_line": 370, - "stop_column": 16, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `WorkflowTrigger` is not assignable to parameter `matching_model` with type `MatchingModel` in function `matches`", "concise_description": "Argument `WorkflowTrigger` is not assignable to parameter `matching_model` with type `MatchingModel` in function `matches`", "severity": "error" }, { - "line": 395, "column": 17, - "stop_line": 395, - "stop_column": 55, "path": "src/documents/matching.py", - "code": -2, "name": "unsupported-operation", - "description": "`&` is not supported between `None` and `set[Any]`\n Cannot find `__and__` or `__rand__`", "concise_description": "`&` is not supported between `None` and `set[Any]`", "severity": "error" }, { - "line": 405, "column": 42, - "stop_line": 405, - "stop_column": 58, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `set[Any] | None` is not assignable to parameter `s` with type `Iterable[object]` in function `set.issubset`\n Protocol `Iterable` requires attribute `__iter__`", "concise_description": "Argument `set[Any] | None` is not assignable to parameter `s` with type `Iterable[object]` in function `set.issubset`", "severity": "error" }, { - "line": 414, "column": 12, - "stop_line": 414, - "stop_column": 47, "path": "src/documents/matching.py", - "code": -2, "name": "unsupported-operation", - "description": "`&` is not supported between `None` and `set[Any]`\n Cannot find `__and__` or `__rand__`", "concise_description": "`&` is not supported between `None` and `set[Any]`", "severity": "error" }, { - "line": 685, "column": 21, - "stop_line": 685, - "stop_column": 29, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `ConsumableDocument` in function `consumable_document_matches_workflow`", "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `ConsumableDocument` in function `consumable_document_matches_workflow`", "severity": "error" }, { - "line": 694, "column": 21, - "stop_line": 694, - "stop_column": 29, "path": "src/documents/matching.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `existing_document_matches_workflow`", "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `existing_document_matches_workflow`", "severity": "error" }, { - "line": 116, "column": 11, - "stop_line": 116, - "stop_column": 15, "path": "src/documents/models.py", - "code": -2, "name": "inconsistent-inheritance", - "description": "Field `ordering` has inconsistent types inherited from multiple base classes\n Inherited types include:\n `tuple[Literal['name']]` from `Meta`\n `list[str]` from `Meta`", "concise_description": "Field `ordering` has inconsistent types inherited from multiple base classes", "severity": "error" }, { - "line": 453, "column": 21, - "stop_line": 453, - "stop_column": 38, "path": "src/documents/models.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 1031, + "column": 17, + "path": "src/documents/models.py", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `transaction_id` in function `django.db.models.query.QuerySet.delete`", + "severity": "error" + }, + { + "column": 28, + "path": "src/documents/models.py", + "name": "bad-argument-type", + "concise_description": "Argument `UUID | Unknown` is not assignable to parameter `transaction_id` with type `str` in function `django_softdelete.models.SoftDeleteModel.delete`", + "severity": "error" + }, + { "column": 9, - "stop_line": 1031, - "stop_column": 15, "path": "src/documents/models.py", - "code": -2, "name": "bad-override", - "description": "Class member `ShareLinkBundle.delete` overrides parent class `Model` in an inconsistent manner\n `ShareLinkBundle.delete` has type `(self: ShareLinkBundle, using: Unknown | None = None, *, keep_parents: bool | Unknown = False) -> tuple[int, dict[str, int]]`, which is not assignable to `(self: ShareLinkBundle, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]`, the type of `Model.delete`\n Signature mismatch:\n expected: def delete(self: ShareLinkBundle, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ parameters\n found: def delete(self: ShareLinkBundle, using: Unknown | None = None, *, keep_parents: bool | Unknown = False) -> tuple[int, dict...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", "concise_description": "Class member `ShareLinkBundle.delete` overrides parent class `Model` in an inconsistent manner", "severity": "error" }, { - "line": 1206, "column": 54, - "stop_line": 1206, - "stop_column": 74, "path": "src/documents/models.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `CustomFieldInstance.get_value_field_name`", "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `CustomFieldInstance.get_value_field_name`", "severity": "error" }, { - "line": 1230, "column": 5, - "stop_line": 1230, - "stop_column": 13, "path": "src/documents/models.py", - "code": -2, "name": "unbound-name", - "description": "`auditlog` may be uninitialized", "concise_description": "`auditlog` may be uninitialized", "severity": "error" }, { - "line": 146, "column": 28, - "stop_line": 146, - "stop_column": 31, "path": "src/documents/parsers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `list[Path | str | Unknown]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", "concise_description": "Argument `list[Path | str | Unknown]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", "severity": "error" }, { - "line": 123, "column": 42, - "stop_line": 123, - "stop_column": 64, "path": "src/documents/permissions.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `exists`", "concise_description": "Object of class `list` has no attribute `exists`", "severity": "error" }, { - "line": 124, "column": 35, - "stop_line": 124, - "stop_column": 58, "path": "src/documents/permissions.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `exclude`", "concise_description": "Object of class `list` has no attribute `exclude`", "severity": "error" }, { - "line": 125, "column": 16, - "stop_line": 125, - "stop_column": 38, "path": "src/documents/permissions.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `exists`", "concise_description": "Object of class `list` has no attribute `exists`", "severity": "error" }, { - "line": 97, + "column": 6, + "path": "src/documents/permissions.py", + "name": "bad-specialization", + "concise_description": "`int` is not assignable to upper bound `Model` of type variable `_Model`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/permissions.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['global_objects']` is not assignable to parameter `name` with type `Literal['objects']` in function `django.db.models.base.ModelBase.__getattr__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/permissions.py", + "name": "bad-return", + "concise_description": "Returned type `QuerySet[Model, Any]` is not assignable to declared return type `QuerySet[int, int]`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/permissions.py", + "name": "bad-return", + "concise_description": "Returned type `QuerySet[Model, Any]` is not assignable to declared return type `QuerySet[int, int]`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/permissions.py", + "name": "bad-return", + "concise_description": "Returned type `QuerySet[Model, Any]` is not assignable to declared return type `QuerySet[int, int]`", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/permissions.py", + "name": "bad-return", + "concise_description": "Returned type `QuerySet[Model, Any]` is not assignable to declared return type `QuerySet[int, int]`", + "severity": "error" + }, + { + "column": 6, + "path": "src/documents/permissions.py", + "name": "bad-specialization", + "concise_description": "`int` is not assignable to upper bound `Model` of type variable `_Model`", + "severity": "error" + }, + { "column": 29, - "stop_line": 97, - "stop_column": 48, "path": "src/documents/plugins/helpers.py", - "code": -2, "name": "bad-assignment", - "description": "`BaseChannelLayer | None` is not assignable to attribute `_channel` with type `RedisPubSubChannelLayer | None`", "concise_description": "`BaseChannelLayer | None` is not assignable to attribute `_channel` with type `RedisPubSubChannelLayer | None`", "severity": "error" }, { - "line": 23, "column": 26, - "stop_line": 23, - "stop_column": 33, "path": "src/documents/regex.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `error` has no attribute `msg`", "concise_description": "Object of class `error` has no attribute `msg`", "severity": "error" }, { - "line": 186, - "column": 24, - "stop_line": 186, - "stop_column": 51, + "column": 33, "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `writer`", - "concise_description": "Object of class `NoneType` has no attribute `writer`", + "name": "unbound-name", + "concise_description": "`correspondent` may be uninitialized", "severity": "error" }, { - "line": 192, - "column": 17, - "stop_line": 192, - "stop_column": 36, + "column": 33, "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `commit`", - "concise_description": "Object of class `NoneType` has no attribute `commit`", + "name": "unbound-name", + "concise_description": "`document_type` may be uninitialized", "severity": "error" }, { - "line": 193, - "column": 17, - "stop_line": 193, - "stop_column": 44, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `reload`", - "concise_description": "Object of class `NoneType` has no attribute `reload`", - "severity": "error" - }, - { - "line": 222, - "column": 9, - "stop_line": 222, - "stop_column": 34, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `add_document`", - "concise_description": "Object of class `NoneType` has no attribute `add_document`", - "severity": "error" - }, - { - "line": 235, - "column": 9, - "stop_line": 235, - "stop_column": 47, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `delete_documents_by_query`", - "concise_description": "Object of class `NoneType` has no attribute `delete_documents_by_query`", - "severity": "error" - }, - { - "line": 237, - "column": 17, - "stop_line": 237, - "stop_column": 38, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "severity": "error" - }, - { - "line": 333, - "column": 44, - "stop_line": 333, - "stop_column": 55, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_query`", - "severity": "error" - }, - { - "line": 335, "column": 45, - "stop_line": 335, - "stop_column": 56, "path": "src/documents/search/_backend.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_title_query`", + "concise_description": "Argument `list[int]` is not assignable to parameter `args` with type `tuple[Any, ...] | None` in function `celery.app.task.Task.apply_async`", "severity": "error" }, { - "line": 337, - "column": 37, - "stop_line": 337, - "stop_column": 48, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_user_query`", - "severity": "error" - }, - { - "line": 346, "column": 57, - "stop_line": 346, - "stop_column": 69, "path": "src/documents/search/_backend.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", + "concise_description": "Argument `list[int]` is not assignable to parameter `args` with type `tuple[Any, ...] | None` in function `celery.app.task.Task.apply_async`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/search/_backend.py", + "name": "bad-override", + "concise_description": "Class member `_DocumentViewerStream.__iter__` overrides parent class `QuerySetStream` in an inconsistent manner", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/search/_query.py", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `children` in function `whoosh_compat.ast.Node.__init__`", + "severity": "error" + }, + { + "column": 59, + "path": "src/documents/search/_query.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `int | None` is not assignable to parameter `analyzed` with type `bool` in function `whoosh_compat.ast.Term.__init__`", + "severity": "error" + }, + { + "column": 74, + "path": "src/documents/search/_query.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `int | None` is not assignable to parameter `analyzed` with type `bool` in function `whoosh_compat.ast.Term.__init__`", + "severity": "error" + }, + { + "column": 28, + "path": "src/documents/search/_query.py", + "name": "bad-argument-type", + "concise_description": "Argument `FieldRef | None` is not assignable to parameter `field` with type `FieldRef` in function `whoosh_compat.ast.Fuzzy.__init__`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/search/_schema.py", + "name": "unexpected-keyword", + "concise_description": "Unexpected keyword argument `fast` in function `tantivy.tantivy.SchemaBuilder.add_json_field`", "severity": "error" }, { - "line": 389, - "column": 50, - "stop_line": 389, - "stop_column": 75, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "concise_description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "severity": "error" - }, - { - "line": 395, - "column": 50, - "stop_line": 395, - "stop_column": 75, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "concise_description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "severity": "error" - }, - { - "line": 400, - "column": 49, - "stop_line": 400, - "stop_column": 73, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "concise_description": "Argument `int | None` is not assignable to parameter `value` with type `int` in function `tantivy.tantivy.Document.add_unsigned`", - "severity": "error" - }, - { - "line": 414, - "column": 21, - "stop_line": 414, - "stop_column": 35, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `notes`", - "concise_description": "Object of class `Document` has no attribute `notes`", - "severity": "error" - }, - { - "line": 423, - "column": 20, - "stop_line": 423, - "stop_column": 42, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 465, - "column": 43, - "stop_line": 465, - "stop_column": 50, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `str` has no attribute `pk`", - "concise_description": "Object of class `str` has no attribute `pk`", - "severity": "error" - }, - { - "line": 555, - "column": 65, - "stop_line": 555, - "stop_column": 76, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_highlight_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `index` with type `Index` in function `documents.search._query.parse_simple_text_highlight_query`", - "severity": "error" - }, - { - "line": 566, - "column": 17, - "stop_line": 566, - "stop_column": 40, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `parse_query`", - "concise_description": "Object of class `NoneType` has no attribute `parse_query`", - "severity": "error" - }, - { - "line": 573, - "column": 20, - "stop_line": 573, - "stop_column": 40, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `searcher`", - "concise_description": "Object of class `NoneType` has no attribute `searcher`", - "severity": "error" - }, - { - "line": 582, - "column": 17, - "stop_line": 582, - "stop_column": 29, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "severity": "error" - }, - { - "line": 609, - "column": 25, - "stop_line": 609, - "stop_column": 37, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "severity": "error" - }, - { - "line": 624, - "column": 29, - "stop_line": 624, - "stop_column": 41, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.SnippetGenerator.create`", - "severity": "error" - }, - { - "line": 679, - "column": 20, - "stop_line": 679, - "stop_column": 40, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `searcher`", - "concise_description": "Object of class `NoneType` has no attribute `searcher`", - "severity": "error" - }, - { - "line": 739, - "column": 20, - "stop_line": 739, - "stop_column": 40, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `searcher`", - "concise_description": "Object of class `NoneType` has no attribute `searcher`", - "severity": "error" - }, - { - "line": 752, - "column": 25, - "stop_line": 752, - "stop_column": 37, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.term_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.term_query`", - "severity": "error" - }, - { - "line": 760, - "column": 25, - "stop_line": 760, - "stop_column": 37, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.regex_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.regex_query`", - "severity": "error" - }, - { - "line": 770, - "column": 37, - "stop_line": 770, - "stop_column": 54, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", - "severity": "error" - }, - { - "line": 774, - "column": 66, - "stop_line": 774, - "stop_column": 78, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `documents.search._query.build_permission_filter`", - "severity": "error" - }, - { - "line": 822, - "column": 20, - "stop_line": 822, - "stop_column": 40, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `searcher`", - "concise_description": "Object of class `NoneType` has no attribute `searcher`", - "severity": "error" - }, - { - "line": 825, - "column": 13, - "stop_line": 825, - "stop_column": 25, - "path": "src/documents/search/_backend.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "severity": "error" - }, - { - "line": 132, "column": 9, - "stop_line": 132, - "stop_column": 17, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `MatchingModelSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `data`, expected `attrs`", "concise_description": "Class member `MatchingModelSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 206, "column": 62, - "stop_line": 208, - "stop_column": 26, "path": "src/documents/serialisers.py", - "code": -2, "name": "unsupported-operation", - "description": "Cannot set item in `dict[str, QuerySet[User, User]]`\n Argument `QuerySet[Group, Group]` is not assignable to parameter `value` with type `QuerySet[User, User]` in function `dict.__setitem__`", "concise_description": "Cannot set item in `dict[str, QuerySet[User, User]]`", "severity": "error" }, { - "line": 295, "column": 17, - "stop_line": 299, - "stop_column": 30, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `list` has no attribute `values_list`", "concise_description": "Object of class `list` has no attribute `values_list`", "severity": "error" }, { - "line": 361, - "column": 21, - "stop_line": 361, - "stop_column": 37, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `has_perm`", - "concise_description": "Object of class `NoneType` has no attribute `has_perm`", - "severity": "error" - }, - { - "line": 473, "column": 9, - "stop_line": 473, - "stop_column": 26, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `OwnedObjectListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner\n Got parameter name `documents`, expected `data`", "concise_description": "Class member `OwnedObjectListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 474, "column": 9, - "stop_line": 474, - "stop_column": 27, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `context`", "concise_description": "Object of class `NoneType` has no attribute `context`", "severity": "error" }, { - "line": 474, "column": 51, - "stop_line": 474, - "stop_column": 83, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", - "concise_description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "concise_description": "Object of type `BaseSerializer[Unknown] | Field[Unknown, Unknown, Unknown, Unknown] | None` has no attribute `get_shared_object_pks`", "severity": "error" }, { - "line": 484, - "column": 17, - "stop_line": 484, - "stop_column": 30, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Correspondent]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Correspondent]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 503, - "column": 17, - "stop_line": 503, - "stop_column": 29, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[DocumentType]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[DocumentType]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 573, "column": 14, - "stop_line": 578, - "stop_column": 6, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-assignment", - "description": "`ManyRelatedField | RelatedField[@_, @_, Any]` is not assignable to attribute `parent` with type `BaseSerializer[Unknown]`", "concise_description": "`ManyRelatedField | RelatedField[@_, @_, Any]` is not assignable to attribute `parent` with type `BaseSerializer[Unknown]`", "severity": "error" }, { - "line": 628, "column": 17, - "stop_line": 628, - "stop_column": 20, "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Tag]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Tag]` is not assignable to attribute `model` with type `type[_MT]`", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `Mapping[str, Any]`", "severity": "error" }, { - "line": 654, "column": 9, - "stop_line": 654, - "stop_column": 17, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `TagSerializer.validate` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n Got parameter name `attrs`, expected `data`", "concise_description": "Class member `TagSerializer.validate` overrides parent class `MatchingModelSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 707, "column": 17, - "stop_line": 707, - "stop_column": 42, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `type[CustomField.FieldDataType]` is not assignable to parameter `choices` with type `Sequence[Any]` in function `rest_framework.fields.ChoiceField.__init__`", "concise_description": "Argument `type[CustomField.FieldDataType]` is not assignable to parameter `choices` with type `Sequence[Any]` in function `rest_framework.fields.ChoiceField.__init__`", "severity": "error" }, { - "line": 714, - "column": 17, - "stop_line": 714, - "stop_column": 28, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[CustomField]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[CustomField]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 792, "column": 28, - "stop_line": 792, - "stop_column": 39, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-assignment", - "description": "`Unknown | None` is not assignable to attribute `method_name` with type `str`", "concise_description": "`Unknown | None` is not assignable to attribute `method_name` with type `str`", "severity": "error" }, { - "line": 830, "column": 13, - "stop_line": 830, - "stop_column": 35, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", "severity": "error" }, { - "line": 846, "column": 9, - "stop_line": 846, - "stop_column": 18, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `CustomFieldInstanceSerializer.get_value` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `obj`, expected `dictionary`", "concise_description": "Class member `CustomFieldInstanceSerializer.get_value` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 849, "column": 9, - "stop_line": 849, - "stop_column": 17, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `CustomFieldInstanceSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner\n Got parameter name `data`, expected `attrs`", "concise_description": "Class member `CustomFieldInstanceSerializer.validate` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 892, "column": 34, - "stop_line": 892, - "stop_column": 68, "path": "src/documents/serialisers.py", - "code": -2, "name": "unsupported-operation", - "description": "`None` is not subscriptable", "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 920, - "column": 17, - "stop_line": 920, - "stop_column": 36, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[CustomFieldInstance]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[CustomFieldInstance]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 930, - "column": 17, - "stop_line": 930, - "stop_column": 21, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 938, - "column": 17, - "stop_line": 938, - "stop_column": 21, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Note]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Note]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 1095, "column": 30, - "stop_line": 1095, - "stop_column": 55, "path": "src/documents/serialisers.py", - "code": -2, "name": "unsupported-operation", - "description": "`None` is not subscriptable", "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 1139, - "column": 12, - "stop_line": 1139, - "stop_column": 34, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1143, - "column": 42, - "stop_line": 1143, - "stop_column": 64, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1227, - "column": 17, - "stop_line": 1227, - "stop_column": 25, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Document]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Document]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 1262, "column": 9, - "stop_line": 1262, - "stop_column": 26, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `SearchResultListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner\n Got parameter name `hits`, expected `data`", "concise_description": "Class member `SearchResultListSerializer.to_representation` overrides parent class `ListSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 1265, "column": 21, - "stop_line": 1265, - "stop_column": 47, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `BaseSerializer` has no attribute `fetch_documents`\nObject of class `Field` has no attribute `fetch_documents`\nObject of class `NoneType` has no attribute `fetch_documents`", - "concise_description": "Object of class `BaseSerializer` has no attribute `fetch_documents`\nObject of class `Field` has no attribute `fetch_documents`\nObject of class `NoneType` has no attribute `fetch_documents`", + "concise_description": "Object of type `BaseSerializer[Unknown] | Field[Unknown, Unknown, Unknown, Unknown] | None` has no attribute `fetch_documents`", "severity": "error" }, { - "line": 1266, "column": 9, - "stop_line": 1266, - "stop_column": 27, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `context`", "concise_description": "Object of class `NoneType` has no attribute `context`", "severity": "error" }, { - "line": 1268, "column": 9, - "stop_line": 1268, - "stop_column": 27, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `context`", "concise_description": "Object of class `NoneType` has no attribute `context`", "severity": "error" }, { - "line": 1268, "column": 51, - "stop_line": 1268, - "stop_column": 83, "path": "src/documents/serialisers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", - "concise_description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "concise_description": "Object of type `BaseSerializer[Unknown] | Field[Unknown, Unknown, Unknown, Unknown] | None` has no attribute `get_shared_object_pks`", "severity": "error" }, { - "line": 1293, "column": 9, - "stop_line": 1293, - "stop_column": 26, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-param-name", - "description": "Class member `SearchResultSerializer.to_representation` overrides parent class `DocumentSerializer` in an inconsistent manner\n Got parameter name `hit`, expected `instance`", "concise_description": "Class member `SearchResultSerializer.to_representation` overrides parent class `DocumentSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 1315, "column": 9, - "stop_line": 1315, - "stop_column": 30, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override-mutable-attribute", - "description": "Class member `Meta.list_serializer_class` overrides parent class `Meta` in an inconsistent manner\n `Meta.list_serializer_class` has type `type[SearchResultListSerializer]`, which is not consistent with `type[OwnedObjectListSerializer]` in `Meta.list_serializer_class` (the type of read-write attributes cannot be changed)", "concise_description": "Class member `Meta.list_serializer_class` overrides parent class `Meta` in an inconsistent manner", "severity": "error" }, { - "line": 1320, - "column": 17, - "stop_line": 1320, - "stop_column": 36, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[SavedViewFilterRule]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[SavedViewFilterRule]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 1328, - "column": 17, - "stop_line": 1328, - "stop_column": 26, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[SavedView]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[SavedView]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 1467, "column": 21, - "stop_line": 1467, - "stop_column": 62, "path": "src/documents/serialisers.py", - "code": -2, "name": "unsupported-operation", - "description": "`Literal[SavedView.DisplayFields.CUSTOM_FIELD]` is not subscriptable", "concise_description": "`Literal[SavedView.DisplayFields.CUSTOM_FIELD]` is not subscriptable", "severity": "error" }, { - "line": 1469, "column": 36, - "stop_line": 1469, - "stop_column": 63, "path": "src/documents/serialisers.py", - "code": -2, "name": "unsupported-operation", - "description": "`None` is not subscriptable", "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 1696, "column": 7, - "stop_line": 1696, - "stop_column": 25, "path": "src/documents/serialisers.py", - "code": -2, "name": "invalid-inheritance", - "description": "Class `BulkEditSerializer` has inconsistent type arguments for base class `Field`: `Field[Any, Any, Any, dict[str, Any]]` and `Field[Any, Any, Any, dict[str, list[int]]]`", "concise_description": "Class `BulkEditSerializer` has inconsistent type arguments for base class `Field`: `Field[Any, Any, Any, dict[str, Any]]` and `Field[Any, Any, Any, dict[str, list[int]]]`", "severity": "error" }, { - "line": 2356, "column": 73, - "stop_line": 2356, - "stop_column": 80, "path": "src/documents/serialisers.py", - "code": -2, "name": "unbound-name", - "description": "`address` is uninitialized", "concise_description": "`address` is uninitialized", "severity": "error" }, { - "line": 2370, - "column": 17, - "stop_line": 2370, - "stop_column": 28, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[StoragePath]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[StoragePath]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2418, - "column": 17, - "stop_line": 2418, - "stop_column": 27, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[UiSettings]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[UiSettings]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2434, "column": 9, - "stop_line": 2434, - "stop_column": 15, "path": "src/documents/serialisers.py", - "code": -2, "name": "bad-override", - "description": "Class member `UiSettingsViewSerializer.create` overrides parent class `ModelSerializer` in an inconsistent manner\n `UiSettingsViewSerializer.create` has type `(self: UiSettingsViewSerializer, validated_data: Unknown) -> tuple[UiSettings, bool]`, which is not assignable to `(self: UiSettingsViewSerializer, validated_data: Any) -> UiSettings`, the type of `ModelSerializer.create`\n Signature mismatch:\n expected: def create(self: UiSettingsViewSerializer, validated_data: Any) -> UiSettings: ...\n ^^^ ^^^^^^^^^^ return type\n |\n parameters\n found: def create(self: UiSettingsViewSerializer, validated_data: Unknown) -> tuple[UiSettings, bool]: ...\n ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", "concise_description": "Class member `UiSettingsViewSerializer.create` overrides parent class `ModelSerializer` in an inconsistent manner", "severity": "error" }, { - "line": 2463, - "column": 17, - "stop_line": 2463, - "stop_column": 30, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2516, - "column": 17, - "stop_line": 2516, - "stop_column": 30, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[PaperlessTask]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2554, "column": 46, - "stop_line": 2554, - "stop_column": 76, "path": "src/documents/serialisers.py", - "code": -2, "name": "no-matching-overload", - "description": "No matching overload found for function `dict.get` called with arguments: (str, str)\n Possible overloads:\n (key: PaperlessTask.TaskType, default: None = None, /) -> str | None\n (key: PaperlessTask.TaskType, default: str, /) -> str [closest match]\n (key: PaperlessTask.TaskType, default: _T, /) -> str | _T", "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, str)", "severity": "error" }, { - "line": 2570, "column": 38, - "stop_line": 2570, - "stop_column": 70, "path": "src/documents/serialisers.py", - "code": -2, "name": "no-matching-overload", - "description": "No matching overload found for function `dict.get` called with arguments: (str, str)\n Possible overloads:\n (key: PaperlessTask.Status, default: None = None, /) -> str | None\n (key: PaperlessTask.Status, default: str, /) -> str [closest match]\n (key: PaperlessTask.Status, default: _T, /) -> str | _T", "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, str)", "severity": "error" }, { - "line": 2581, "column": 51, - "stop_line": 2581, - "stop_column": 86, "path": "src/documents/serialisers.py", - "code": -2, "name": "no-matching-overload", - "description": "No matching overload found for function `dict.get` called with arguments: (str, Literal['manual_task'])\n Possible overloads:\n (key: PaperlessTask.TriggerSource, default: None = None, /) -> str | None\n (key: PaperlessTask.TriggerSource, default: str, /) -> str [closest match]\n (key: PaperlessTask.TriggerSource, default: _T, /) -> str | _T", "concise_description": "No matching overload found for function `dict.get` called with arguments: (str, Literal['manual_task'])", "severity": "error" }, { - "line": 2659, - "column": 17, - "stop_line": 2659, - "stop_column": 26, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[ShareLink]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[ShareLink]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2704, - "column": 17, - "stop_line": 2704, - "stop_column": 32, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[ShareLinkBundle]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[ShareLinkBundle]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 2917, - "column": 17, - "stop_line": 2917, - "stop_column": 32, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[WorkflowTrigger]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[WorkflowTrigger]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 3013, - "column": 17, - "stop_line": 3013, - "stop_column": 36, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[WorkflowActionEmail]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[WorkflowActionEmail]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 3033, - "column": 17, - "stop_line": 3033, - "stop_column": 38, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[WorkflowActionWebhook]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[WorkflowActionWebhook]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 3056, - "column": 17, - "stop_line": 3056, - "stop_column": 31, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[WorkflowAction]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[WorkflowAction]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 3175, - "column": 17, - "stop_line": 3175, - "stop_column": 25, - "path": "src/documents/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Workflow]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Workflow]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 3375, "column": 52, - "stop_line": 3375, - "stop_column": 60, "path": "src/documents/serialisers.py", - "code": -2, "name": "unbound-name", - "description": "`triggers` may be uninitialized", "concise_description": "`triggers` may be uninitialized", "severity": "error" }, { - "line": 3375, "column": 62, - "stop_line": 3375, - "stop_column": 69, "path": "src/documents/serialisers.py", - "code": -2, "name": "unbound-name", - "description": "`actions` may be uninitialized", "concise_description": "`actions` may be uninitialized", "severity": "error" }, { - "line": 124, "column": 72, - "stop_line": 124, - "stop_column": 82, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", "severity": "error" }, { - "line": 185, "column": 72, - "stop_line": 185, - "stop_column": 82, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", "severity": "error" }, { - "line": 267, "column": 50, - "stop_line": 267, - "stop_column": 60, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", "severity": "error" }, { - "line": 311, "column": 70, - "stop_line": 311, - "stop_column": 80, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", "severity": "error" }, { - "line": 544, "column": 46, - "stop_line": 544, - "stop_column": 66, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 545, "column": 49, - "stop_line": 545, - "stop_column": 69, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 550, "column": 28, - "stop_line": 550, - "stop_column": 52, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `is_file`", "concise_description": "Object of class `NoneType` has no attribute `is_file`", "severity": "error" }, { - "line": 576, "column": 43, - "stop_line": 576, - "stop_column": 60, "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "bad-typed-dict-key", - "description": "`str` is not assignable to TypedDict key `filename` with type `datetime`", - "concise_description": "`str` is not assignable to TypedDict key `filename` with type `datetime`", + "name": "bad-assignment", + "concise_description": "`str` is not assignable to dict key `filename` with type `datetime`", "severity": "error" }, { - "line": 578, "column": 51, - "stop_line": 578, - "stop_column": 76, "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "bad-typed-dict-key", - "description": "`Any | None` is not assignable to TypedDict key `archive_filename` with type `datetime`", - "concise_description": "`Any | None` is not assignable to TypedDict key `archive_filename` with type `datetime`", + "name": "bad-assignment", + "concise_description": "`Any | None` is not assignable to dict key `archive_filename` with type `datetime`", "severity": "error" }, { - "line": 597, "column": 21, - "stop_line": 597, - "stop_column": 37, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `old_path` with type `Path` in function `validate_move`", "concise_description": "Argument `Path | None` is not assignable to parameter `old_path` with type `Path` in function `validate_move`", "severity": "error" }, { - "line": 598, "column": 21, - "stop_line": 598, - "stop_column": 42, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `new_path` with type `Path` in function `validate_move`", "concise_description": "Argument `Path | None` is not assignable to parameter `new_path` with type `Path` in function `validate_move`", "severity": "error" }, { - "line": 601, "column": 46, - "stop_line": 601, - "stop_column": 67, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", "severity": "error" }, { - "line": 602, "column": 28, - "stop_line": 602, - "stop_column": 69, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-specialization", - "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", "severity": "error" }, { - "line": 602, "column": 29, - "stop_line": 602, - "stop_column": 45, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 622, "column": 20, - "stop_line": 622, - "stop_column": 33, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`move_original` is uninitialized", "concise_description": "`move_original` is uninitialized", "severity": "error" }, { - "line": 624, "column": 55, - "stop_line": 624, - "stop_column": 70, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`old_source_path` is uninitialized", "concise_description": "`old_source_path` is uninitialized", "severity": "error" }, { - "line": 626, "column": 20, - "stop_line": 626, - "stop_column": 32, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`move_archive` is uninitialized", "concise_description": "`move_archive` is uninitialized", "severity": "error" }, { - "line": 626, "column": 37, - "stop_line": 626, - "stop_column": 66, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `is_file`", "concise_description": "Object of class `NoneType` has no attribute `is_file`", "severity": "error" }, { - "line": 628, "column": 32, - "stop_line": 628, - "stop_column": 73, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-specialization", - "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", "severity": "error" }, { - "line": 628, "column": 33, - "stop_line": 628, - "stop_column": 54, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 628, "column": 56, - "stop_line": 628, - "stop_column": 72, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`old_archive_path` is uninitialized", "concise_description": "`old_archive_path` is uninitialized", "severity": "error" }, { - "line": 642, "column": 33, - "stop_line": 642, - "stop_column": 45, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`old_filename` is uninitialized", "concise_description": "`old_filename` is uninitialized", "severity": "error" }, { - "line": 643, "column": 41, - "stop_line": 643, - "stop_column": 61, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unbound-name", - "description": "`old_archive_filename` is uninitialized", "concise_description": "`old_archive_filename` is uninitialized", "severity": "error" }, { - "line": 653, "column": 49, - "stop_line": 653, - "stop_column": 73, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `is_file`", "concise_description": "Object of class `NoneType` has no attribute `is_file`", "severity": "error" }, { - "line": 655, "column": 22, - "stop_line": 655, - "stop_column": 38, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", "severity": "error" }, { - "line": 682, "column": 23, - "stop_line": 682, - "stop_column": 50, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", "concise_description": "Object of class `NoneType` has no attribute `get`", "severity": "error" }, { - "line": 686, - "column": 5, - "stop_line": 686, - "stop_column": 24, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CustomField` has no attribute `fields`", - "concise_description": "Object of class `CustomField` has no attribute `fields`", - "severity": "error" - }, - { - "line": 690, - "column": 24, - "stop_line": 690, - "stop_column": 43, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CustomField` has no attribute `fields`", - "concise_description": "Object of class `CustomField` has no attribute `fields`", - "severity": "error" - }, - { - "line": 707, - "column": 13, - "stop_line": 707, - "stop_column": 28, - "path": "src/documents/signals/handlers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CustomField` has no attribute `fields`", - "concise_description": "Object of class `CustomField` has no attribute `fields`", - "severity": "error" - }, - { - "line": 721, "column": 12, - "stop_line": 721, - "stop_column": 51, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "not-iterable", - "description": "`in` is not supported between `str` and `None`", "concise_description": "`in` is not supported between `str` and `None`", "severity": "error" }, { - "line": 725, "column": 13, - "stop_line": 725, - "stop_column": 39, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `remove`", "concise_description": "Object of class `NoneType` has no attribute `remove`", "severity": "error" }, { - "line": 764, "column": 27, - "stop_line": 764, - "stop_column": 51, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", "concise_description": "Object of class `NoneType` has no attribute `get`", "severity": "error" }, { - "line": 784, "column": 17, - "stop_line": 784, - "stop_column": 52, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "unsupported-operation", - "description": "Cannot set item in `None`\n Object of class `NoneType` has no attribute `__setitem__`", "concise_description": "Cannot set item in `None`", "severity": "error" }, { - "line": 884, "column": 13, - "stop_line": 884, - "stop_column": 33, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `source_path`", "concise_description": "Object of class `ConsumableDocument` has no attribute `source_path`", "severity": "error" }, { - "line": 884, "column": 60, - "stop_line": 884, - "stop_column": 82, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `original_file`", "concise_description": "Object of class `Document` has no attribute `original_file`", "severity": "error" }, { - "line": 931, "column": 29, - "stop_line": 931, - "stop_column": 37, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_assignment_to_document`", "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_assignment_to_document`", "severity": "error" }, { - "line": 938, "column": 59, - "stop_line": 938, - "stop_column": 67, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_removal_to_document`", "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_removal_to_document`", "severity": "error" }, { - "line": 965, + "column": 25, + "path": "src/documents/signals/handlers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `original_file` with type `Path` in function `documents.workflows.actions.execute_email_action`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/signals/handlers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `original_file` with type `Path` in function `documents.workflows.actions.execute_webhook_action`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/signals/handlers.py", + "name": "missing-attribute", + "concise_description": "Object of class `Task` has no attribute `delay_on_commit`", + "severity": "error" + }, + { + "column": 41, + "path": "src/documents/signals/handlers.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", + "severity": "error" + }, + { "column": 17, - "stop_line": 965, - "stop_column": 31, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `title`", "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", "severity": "error" }, { - "line": 965, "column": 34, - "stop_line": 965, - "stop_column": 48, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `title`", "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", "severity": "error" }, { - "line": 975, "column": 17, - "stop_line": 975, - "stop_column": 30, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `save`", "concise_description": "Object of class `ConsumableDocument` has no attribute `save`", "severity": "error" }, { - "line": 1190, "column": 49, - "stop_line": 1190, - "stop_column": 86, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "no-matching-overload", - "description": "No matching overload found for function `dict.get` called with arguments: (Unknown | None, Literal[PaperlessTask.Status.FAILURE])\n Possible overloads:\n (key: str, default: None = None, /) -> PaperlessTask.Status | None\n (key: str, default: PaperlessTask.Status, /) -> PaperlessTask.Status [closest match]\n (key: str, default: _T, /) -> PaperlessTask.Status | _T", "concise_description": "No matching overload found for function `dict.get` called with arguments: (Unknown | None, Literal[PaperlessTask.Status.FAILURE])", "severity": "error" }, { - "line": 1329, "column": 13, - "stop_line": 1329, - "stop_column": 28, "path": "src/documents/signals/handlers.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `BaseDatabaseWrapper` has no attribute `close_pool`", "concise_description": "Object of class `BaseDatabaseWrapper` has no attribute `close_pool`", "severity": "error" }, { - "line": 174, + "column": 13, + "path": "src/documents/signals/handlers.py", + "name": "missing-attribute", + "concise_description": "Object of class `BaseDatabaseWrapper` has no attribute `close_pool`", + "severity": "error" + }, + { "column": 21, - "stop_line": 174, - "stop_column": 36, "path": "src/documents/tasks.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `task_id` with type `str` in function `documents.plugins.base.ConsumeTaskPlugin.__init__`", "concise_description": "Argument `str | None` is not assignable to parameter `task_id` with type `str` in function `documents.plugins.base.ConsumeTaskPlugin.__init__`", "severity": "error" }, { - "line": 218, "column": 16, - "stop_line": 218, - "stop_column": 19, "path": "src/documents/tasks.py", - "code": -2, "name": "bad-return", - "description": "Returned type `str | None` is not assignable to declared return type `ConsumeFileDuplicateResult | ConsumeFileStoppedResult | ConsumeFileSuccessResult | None`", "concise_description": "Returned type `str | None` is not assignable to declared return type `ConsumeFileDuplicateResult | ConsumeFileStoppedResult | ConsumeFileSuccessResult | None`", "severity": "error" }, { - "line": 321, "column": 49, - "stop_line": 321, - "stop_column": 74, "path": "src/documents/tasks.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.utils.compute_checksum`", "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.utils.compute_checksum`", "severity": "error" }, { - "line": 337, - "column": 25, - "stop_line": 337, - "stop_column": 52, - "path": "src/documents/tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 361, - "column": 25, - "stop_line": 361, - "stop_column": 52, - "path": "src/documents/tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 374, - "column": 54, - "stop_line": 374, - "stop_column": 75, - "path": "src/documents/tasks.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "severity": "error" - }, - { - "line": 375, - "column": 36, - "stop_line": 375, - "stop_column": 86, - "path": "src/documents/tasks.py", - "code": -2, - "name": "bad-specialization", - "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", - "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", - "severity": "error" - }, - { - "line": 375, "column": 37, - "stop_line": 375, - "stop_column": 62, "path": "src/documents/tasks.py", - "code": -2, "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`\n Protocol `PathLike` requires attribute `__fspath__`", "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", "severity": "error" }, { - "line": 552, "column": 33, - "stop_line": 552, - "stop_column": 61, "path": "src/documents/tasks.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `run_at`", "concise_description": "Object of class `NoneType` has no attribute `run_at`", "severity": "error" }, { - "line": 309, + "column": 1, + "path": "src/documents/templating/filepath.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = 0.0) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[V]) -> Iterable[V]] | [_T](x: SupportsAbs[_T], /) -> _T | [K, V](value: Mapping[K, V] | Undefined) -> Iterator[tuple[K, V]] | [K, V](value: Mapping[K, V], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[K, V]] | [V](environment: Environment, value: Iterable[V], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[V] | [V](environment: Environment, value: Iterable[V], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | V | [V](value: V, default_value: V = '', boolean: bool = False) -> V | [V](environment: Environment, seq: Reversible[V]) -> Undefined | V | [V](context: Context, seq: Sequence[V]) -> Undefined | V | [V](value: Iterable[V], linecount: int, fill_with: V | None = None) -> Iterator[list[V]]]`", + "severity": "error" + }, + { "column": 17, - "stop_line": 309, - "stop_column": 66, "path": "src/documents/templating/filepath.py", - "code": -2, "name": "unsupported-operation", - "description": "`None` is not subscriptable", "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 331, "column": 12, - "stop_line": 331, - "stop_column": 22, "path": "src/documents/templating/filepath.py", - "code": -2, "name": "bad-return", - "description": "Returned type `dict[str, dict[str, dict[str, str | Any | None]]]` is not assignable to declared return type `dict[str, dict[str, dict[str, str]]]`", "concise_description": "Returned type `dict[str, dict[str, dict[str, str | Any | None]]]` is not assignable to declared return type `dict[str, dict[str, dict[str, str]]]`", "severity": "error" }, { - "line": 30, "column": 17, - "stop_line": 30, - "stop_column": 38, "path": "src/documents/templating/filters.py", - "code": -2, "name": "bad-assignment", - "description": "`datetime | None` is not assignable to variable `value` with type `date | datetime | str`", "concise_description": "`datetime | None` is not assignable to variable `value` with type `date | datetime | str`", "severity": "error" }, { - "line": 47, "column": 17, - "stop_line": 47, - "stop_column": 34, "path": "src/documents/templating/filters.py", - "code": -2, "name": "bad-assignment", - "description": "`date | None` is not assignable to variable `value` with type `datetime | str`", "concise_description": "`date | None` is not assignable to variable `value` with type `datetime | str`", "severity": "error" }, { - "line": 48, "column": 12, - "stop_line": 48, - "stop_column": 26, "path": "src/documents/templating/filters.py", - "code": -2, "name": "missing-attribute", - "description": "Object of class `str` has no attribute `strftime`", "concise_description": "Object of class `str` has no attribute `strftime`", "severity": "error" }, { - "line": 109, + "column": 1, + "path": "src/documents/templating/workflows.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = 0.0) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[V]) -> Iterable[V]] | [_T](x: SupportsAbs[_T], /) -> _T | [K, V](value: Mapping[K, V] | Undefined) -> Iterator[tuple[K, V]] | [K, V](value: Mapping[K, V], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[K, V]] | [V](environment: Environment, value: Iterable[V], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[V] | [V](environment: Environment, value: Iterable[V], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | V | [V](value: V, default_value: V = '', boolean: bool = False) -> V | [V](environment: Environment, seq: Reversible[V]) -> Undefined | V | [V](context: Context, seq: Sequence[V]) -> Undefined | V | [V](value: Iterable[V], linecount: int, fill_with: V | None = None) -> Iterator[list[V]]]`", + "severity": "error" + }, + { "column": 12, - "stop_line": 109, - "stop_column": 16, "path": "src/documents/templating/workflows.py", - "code": -2, "name": "bad-return", - "description": "Returned type `None` is not assignable to declared return type `str`", "concise_description": "Returned type `None` is not assignable to declared return type `str`", "severity": "error" }, { - "line": 86, - "column": 12, - "stop_line": 95, - "stop_column": 6, - "path": "src/documents/tests/conftest.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `DocumentFactory` is not assignable to declared return type `Document`", - "concise_description": "Returned type `DocumentFactory` is not assignable to declared return type `Document`", - "severity": "error" - }, - { - "line": 134, - "column": 12, - "stop_line": 134, - "stop_column": 49, - "path": "src/documents/tests/conftest.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `create_user`", - "concise_description": "Object of class `Manager` has no attribute `create_user`", - "severity": "error" - }, - { - "line": 98, "column": 22, - "stop_line": 98, - "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 99, "column": 22, - "stop_line": 99, - "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 110, "column": 22, - "stop_line": 110, - "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 111, "column": 22, - "stop_line": 111, - "stop_column": 35, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 237, "column": 26, - "stop_line": 237, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 238, "column": 26, - "stop_line": 238, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 250, "column": 26, - "stop_line": 250, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 251, "column": 26, - "stop_line": 251, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 271, "column": 26, - "stop_line": 271, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 272, "column": 26, - "stop_line": 272, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 292, "column": 26, - "stop_line": 292, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 293, "column": 26, - "stop_line": 293, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 305, "column": 26, - "stop_line": 305, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stdout` with type `OutputWrapper`", "severity": "error" }, { - "line": 306, "column": 26, - "stop_line": 306, - "stop_column": 39, "path": "src/documents/tests/management/test_management_base_cmd.py", - "code": -2, "name": "bad-assignment", - "description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "concise_description": "`StringIO` is not assignable to attribute `stderr` with type `OutputWrapper`", "severity": "error" }, { - "line": 196, - "column": 14, - "stop_line": 196, - "stop_column": 29, - "path": "src/documents/tests/management/test_management_sanity_checker.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `source_path`", - "concise_description": "Object of class `DocumentFactory` has no attribute `source_path`", - "severity": "error" - }, - { - "line": 197, - "column": 14, - "stop_line": 197, - "stop_column": 32, - "path": "src/documents/tests/management/test_management_sanity_checker.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `thumbnail_path`", - "concise_description": "Object of class `DocumentFactory` has no attribute `thumbnail_path`", - "severity": "error" - }, - { - "line": 518, - "column": 16, - "stop_line": 518, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 529, - "column": 16, - "stop_line": 529, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 540, - "column": 16, - "stop_line": 540, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 551, - "column": 16, - "stop_line": 551, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 563, - "column": 16, - "stop_line": 563, - "stop_column": 66, - "path": "src/documents/tests/search/test_query.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 71, - "column": 16, - "stop_line": 71, - "stop_column": 65, - "path": "src/documents/tests/search/test_tokenizer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 82, - "column": 16, - "stop_line": 82, - "stop_column": 64, - "path": "src/documents/tests/search/test_tokenizer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 100, - "column": 16, - "stop_line": 100, - "stop_column": 71, - "path": "src/documents/tests/search/test_tokenizer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SearchResult` has no attribute `count`", - "concise_description": "Object of class `SearchResult` has no attribute `count`", - "severity": "error" - }, - { - "line": 25, - "column": 20, - "stop_line": 25, - "stop_column": 43, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `searcher`", - "concise_description": "Object of class `NoneType` has no attribute `searcher`", - "severity": "error" - }, - { - "line": 28, - "column": 17, - "stop_line": 28, - "stop_column": 32, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `schema` with type `Schema` in function `tantivy.tantivy.Query.range_query`", - "severity": "error" - }, - { - "line": 55, - "column": 26, - "stop_line": 55, - "stop_column": 65, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 126, - "column": 26, - "stop_line": 126, - "stop_column": 38, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ModelForm` has no attribute `request`", - "concise_description": "Object of class `ModelForm` has no attribute `request`", - "severity": "error" - }, - { - "line": 138, - "column": 9, - "stop_line": 138, - "stop_column": 21, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ModelForm` has no attribute `request`", - "concise_description": "Object of class `ModelForm` has no attribute `request`", - "severity": "error" - }, - { - "line": 146, - "column": 9, - "stop_line": 146, - "stop_column": 21, - "path": "src/documents/tests/test_admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ModelForm` has no attribute `request`", - "concise_description": "Object of class `ModelForm` has no attribute `request`", - "severity": "error" - }, - { - "line": 195, - "column": 30, - "stop_line": 195, - "stop_column": 43, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `path`", - "concise_description": "Object of class `NoneType` has no attribute `path`", - "severity": "error" - }, - { - "line": 208, - "column": 31, - "stop_line": 208, - "stop_column": 44, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `path`", - "concise_description": "Object of class `NoneType` has no attribute `path`", - "severity": "error" - }, - { - "line": 241, - "column": 25, - "stop_line": 241, - "stop_column": 45, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `path`", - "concise_description": "Object of class `NoneType` has no attribute `path`", - "severity": "error" - }, - { - "line": 277, - "column": 25, - "stop_line": 277, - "stop_column": 45, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `path`", - "concise_description": "Object of class `NoneType` has no attribute `path`", - "severity": "error" - }, - { - "line": 278, - "column": 27, - "stop_line": 278, - "stop_column": 43, - "path": "src/documents/tests/test_api_app_config.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ImageFile` has no attribute `text`", - "concise_description": "Object of class `ImageFile` has no attribute `text`", - "severity": "error" - }, - { - "line": 57, - "column": 20, - "stop_line": 57, - "stop_column": 83, - "path": "src/documents/tests/test_api_bulk_download.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", - "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", - "severity": "error" - }, - { - "line": 279, - "column": 17, - "stop_line": 279, - "stop_column": 34, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 531, - "column": 30, - "stop_line": 531, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 572, - "column": 17, - "stop_line": 572, - "stop_column": 34, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 591, - "column": 17, - "stop_line": 591, - "stop_column": 34, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 641, - "column": 30, - "stop_line": 641, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 658, - "column": 30, - "stop_line": 658, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 659, - "column": 17, - "stop_line": 659, - "stop_column": 34, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 702, - "column": 30, - "stop_line": 702, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 742, - "column": 38, - "stop_line": 742, - "stop_column": 55, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 794, - "column": 30, - "stop_line": 794, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 865, - "column": 30, - "stop_line": 865, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 900, - "column": 30, - "stop_line": 900, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 941, - "column": 30, - "stop_line": 941, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 978, - "column": 30, - "stop_line": 978, - "stop_column": 47, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1073, - "column": 17, - "stop_line": 1073, - "stop_column": 35, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1076, - "column": 17, - "stop_line": 1076, - "stop_column": 35, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1079, - "column": 17, - "stop_line": 1079, - "stop_column": 35, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1098, - "column": 17, - "stop_line": 1098, - "stop_column": 35, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1117, - "column": 17, - "stop_line": 1117, - "stop_column": 35, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1120, - "column": 18, - "stop_line": 1120, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1123, - "column": 18, - "stop_line": 1123, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1137, - "column": 18, - "stop_line": 1137, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1140, - "column": 18, - "stop_line": 1140, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1143, - "column": 18, - "stop_line": 1143, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1170, - "column": 18, - "stop_line": 1170, - "stop_column": 36, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1266, - "column": 13, - "stop_line": 1266, - "stop_column": 37, - "path": "src/documents/tests/test_api_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 306, - "column": 44, - "stop_line": 306, - "stop_column": 67, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 321, - "column": 31, - "stop_line": 321, - "stop_column": 54, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `thumbnail_dir`", - "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", - "severity": "error" - }, - { - "line": 351, - "column": 44, - "stop_line": 351, - "stop_column": 67, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 373, - "column": 20, - "stop_line": 373, - "stop_column": 43, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `thumbnail_dir`", - "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", - "severity": "error" - }, - { - "line": 411, - "column": 19, - "stop_line": 411, - "stop_column": 35, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 453, - "column": 19, - "stop_line": 453, - "stop_column": 35, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 1468, - "column": 13, - "stop_line": 1468, - "stop_column": 20, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `bytes` is not assignable to parameter `data` with type `str` in function `rest_framework.test.APIClient.generic`", - "concise_description": "Argument `bytes` is not assignable to parameter `data` with type `str` in function `rest_framework.test.APIClient.generic`", - "severity": "error" - }, - { - "line": 1732, - "column": 31, - "stop_line": 1732, - "stop_column": 48, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[int] | None` is not assignable to parameter `first` with type `Iterable[Any]` in function `unittest.case.TestCase.assertCountEqual`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `list[int] | None` is not assignable to parameter `first` with type `Iterable[Any]` in function `unittest.case.TestCase.assertCountEqual`", - "severity": "error" - }, - { - "line": 1879, - "column": 9, - "stop_line": 1879, - "stop_column": 25, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "not-iterable", - "description": "Type `None` is not iterable", - "concise_description": "Type `None` is not iterable", - "severity": "error" - }, - { - "line": 2063, - "column": 20, - "stop_line": 2063, - "stop_column": 52, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", - "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", - "severity": "error" - }, - { - "line": 2556, - "column": 31, - "stop_line": 2556, - "stop_column": 52, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `ui_settings`", - "concise_description": "Object of class `User` has no attribute `ui_settings`", - "severity": "error" - }, - { - "line": 2576, - "column": 31, - "stop_line": 2576, - "stop_column": 52, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `ui_settings`", - "concise_description": "Object of class `User` has no attribute `ui_settings`", - "severity": "error" - }, - { - "line": 2594, - "column": 26, - "stop_line": 2594, - "stop_column": 41, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 2606, - "column": 26, - "stop_line": 2606, - "stop_column": 41, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 2614, - "column": 26, - "stop_line": 2614, - "stop_column": 41, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 2615, - "column": 26, - "stop_line": 2615, - "stop_column": 41, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 2623, - "column": 26, - "stop_line": 2623, - "stop_column": 41, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 2975, - "column": 27, - "stop_line": 2975, - "stop_column": 39, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, - { - "line": 2976, - "column": 33, - "stop_line": 2976, - "stop_column": 51, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `username`", - "concise_description": "Object of class `NoneType` has no attribute `username`", - "severity": "error" - }, - { - "line": 2977, - "column": 35, - "stop_line": 2977, - "stop_column": 55, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `first_name`", - "concise_description": "Object of class `NoneType` has no attribute `first_name`", - "severity": "error" - }, - { - "line": 2978, - "column": 34, - "stop_line": 2978, - "stop_column": 53, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `last_name`", - "concise_description": "Object of class `NoneType` has no attribute `last_name`", - "severity": "error" - }, - { - "line": 3676, - "column": 20, - "stop_line": 3676, - "stop_column": 52, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", - "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", - "severity": "error" - }, - { - "line": 4016, - "column": 23, - "stop_line": 4016, - "stop_column": 50, - "path": "src/documents/tests/test_api_documents.py", - "code": -2, - "name": "bad-unpacking", - "description": "Expected argument after ** to have `str` keys, got: dict[str, list[dict[str, str]]] | list[bool] | list[date] | list[float] | list[int] | list[str] | str in function `django.db.models.manager.Manager.create`", - "concise_description": "Expected argument after ** to have `str` keys, got: dict[str, list[dict[str, str]]] | list[bool] | list[date] | list[float] | list[int] | list[str] | str in function `django.db.models.manager.Manager.create`", - "severity": "error" - }, - { - "line": 44, - "column": 20, - "stop_line": 47, - "stop_column": 10, - "path": "src/documents/tests/test_api_email.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", - "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", - "severity": "error" - }, - { - "line": 103, - "column": 24, - "stop_line": 103, - "stop_column": 51, - "path": "src/documents/tests/test_api_email.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `stat`", - "concise_description": "Object of class `NoneType` has no attribute `stat`", - "severity": "error" - }, - { - "line": 27, - "column": 16, - "stop_line": 27, - "stop_column": 44, - "path": "src/documents/tests/test_api_filter_by_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 30, - "column": 16, - "stop_line": 30, - "stop_column": 44, - "path": "src/documents/tests/test_api_filter_by_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 528, - "column": 16, - "stop_line": 528, - "stop_column": 39, - "path": "src/documents/tests/test_api_filter_by_custom_fields.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `SavedView` has no attribute `filter_rules`", - "concise_description": "Object of class `SavedView` has no attribute `filter_rules`", - "severity": "error" - }, - { - "line": 222, - "column": 26, - "stop_line": 222, - "stop_column": 36, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 252, - "column": 26, - "stop_line": 252, - "stop_column": 36, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 299, - "column": 55, - "stop_line": 299, - "stop_column": 59, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", - "severity": "error" - }, - { - "line": 300, - "column": 53, - "stop_line": 300, - "stop_column": 57, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", - "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", - "severity": "error" - }, - { - "line": 344, - "column": 26, - "stop_line": 344, - "stop_column": 36, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `owner`", - "concise_description": "Object of class `NoneType` has no attribute `owner`", - "severity": "error" - }, - { - "line": 345, - "column": 53, - "stop_line": 345, - "stop_column": 57, - "path": "src/documents/tests/test_api_permissions.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", - "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", - "severity": "error" - }, - { - "line": 46, - "column": 21, - "stop_line": 46, - "stop_column": 29, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `name`", - "concise_description": "Object of class `NoneType` has no attribute `name`", - "severity": "error" - }, - { - "line": 49, - "column": 19, - "stop_line": 49, - "stop_column": 39, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `provider_id`", - "concise_description": "Object of class `NoneType` has no attribute `provider_id`", - "severity": "error" - }, - { - "line": 71, - "column": 9, - "stop_line": 71, - "stop_column": 36, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `socialaccount_set`", - "concise_description": "Object of class `User` has no attribute `socialaccount_set`", - "severity": "error" - }, - { - "line": 279, - "column": 41, - "stop_line": 279, - "stop_column": 51, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `key`", - "concise_description": "Object of class `NoneType` has no attribute `key`", - "severity": "error" - }, - { - "line": 382, - "column": 29, - "stop_line": 382, - "stop_column": 56, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `socialaccount_set`", - "concise_description": "Object of class `User` has no attribute `socialaccount_set`", - "severity": "error" - }, - { - "line": 393, - "column": 17, - "stop_line": 393, - "stop_column": 44, - "path": "src/documents/tests/test_api_profile.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `socialaccount_set`", - "concise_description": "Object of class `User` has no attribute `socialaccount_set`", - "severity": "error" - }, - { - "line": 83, - "column": 14, - "stop_line": 83, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 90, - "column": 14, - "stop_line": 90, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 96, - "column": 21, - "stop_line": 96, - "stop_column": 45, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 107, - "column": 14, - "stop_line": 107, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 119, - "column": 14, - "stop_line": 119, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 126, - "column": 14, - "stop_line": 126, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 132, - "column": 34, - "stop_line": 132, - "stop_column": 58, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 144, - "column": 17, - "stop_line": 144, - "stop_column": 41, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 155, - "column": 17, - "stop_line": 155, - "stop_column": 41, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 160, - "column": 26, - "stop_line": 160, - "stop_column": 50, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 190, - "column": 14, - "stop_line": 190, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 200, - "column": 14, - "stop_line": 200, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 217, - "column": 14, - "stop_line": 217, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 222, - "column": 20, - "stop_line": 222, - "stop_column": 44, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 251, - "column": 14, - "stop_line": 251, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 257, - "column": 14, - "stop_line": 257, - "stop_column": 33, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 262, - "column": 21, - "stop_line": 262, - "stop_column": 45, - "path": "src/documents/tests/test_api_schema.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `SchemaGenerator`\n Object of class `SchemaGenerator` has no attribute `__getitem__`", - "concise_description": "Cannot index into `SchemaGenerator`", - "severity": "error" - }, - { - "line": 1647, - "column": 25, - "stop_line": 1647, - "stop_column": 58, - "path": "src/documents/tests/test_api_search.py", - "code": -2, - "name": "unsupported-operation", - "description": "`<` is not supported between `int` and `None`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__lt__`", - "concise_description": "`<` is not supported between `int` and `None`", - "severity": "error" - }, - { - "line": 1647, - "column": 25, - "stop_line": 1647, - "stop_column": 58, - "path": "src/documents/tests/test_api_search.py", - "code": -2, - "name": "unsupported-operation", - "description": "`<` is not supported between `None` and `int`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__gt__`", - "concise_description": "`<` is not supported between `None` and `int`", - "severity": "error" - }, - { - "line": 1647, - "column": 25, - "stop_line": 1647, - "stop_column": 58, - "path": "src/documents/tests/test_api_search.py", - "code": -2, - "name": "unsupported-operation", - "description": "`<` is not supported between `None` and `None`\n Cannot find `__lt__` or `__gt__`", - "concise_description": "`<` is not supported between `None` and `None`", - "severity": "error" - }, - { - "line": 1647, - "column": 28, - "stop_line": 1647, - "stop_column": 40, - "path": "src/documents/tests/test_api_search.py", - "code": -2, - "name": "bad-specialization", - "description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", - "concise_description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", - "severity": "error" - }, - { - "line": 1647, - "column": 46, - "stop_line": 1647, - "stop_column": 58, - "path": "src/documents/tests/test_api_search.py", - "code": -2, - "name": "bad-specialization", - "description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", - "concise_description": "`int | None` is not assignable to upper bound `SupportsDunderGT[Any] | SupportsDunderLT[Any]` of type variable `SupportsRichComparisonT`", - "severity": "error" - }, - { - "line": 106, - "column": 47, - "stop_line": 106, - "stop_column": 72, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `dict[str, Faker]` is not assignable to parameter `data` with type `Iterable[tuple[str, Iterable[bytes | float | str] | bytes | float | str]] | Mapping[str, Iterable[bytes | float | str] | bytes | float | str] | None` in function `rest_framework.test.APIClient.get`", - "concise_description": "Argument `dict[str, Faker]` is not assignable to parameter `data` with type `Iterable[tuple[str, Iterable[bytes | float | str] | bytes | float | str]] | Mapping[str, Iterable[bytes | float | str] | bytes | float | str] | None` in function `rest_framework.test.APIClient.get`", - "severity": "error" - }, - { - "line": 491, - "column": 24, - "stop_line": 491, - "stop_column": 32, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 491, - "column": 34, - "stop_line": 491, - "stop_column": 42, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 506, - "column": 24, - "stop_line": 506, - "stop_column": 31, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 521, - "column": 24, - "stop_line": 521, - "stop_column": 31, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 541, - "column": 24, - "stop_line": 541, - "stop_column": 31, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 584, - "column": 41, - "stop_line": 584, - "stop_column": 52, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `pk`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 825, - "column": 42, - "stop_line": 825, - "stop_column": 48, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 833, - "column": 34, - "stop_line": 833, - "stop_column": 40, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 845, - "column": 42, - "stop_line": 845, - "stop_column": 48, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 864, - "column": 42, - "stop_line": 864, - "stop_column": 48, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 880, - "column": 52, - "stop_line": 880, - "stop_column": 55, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `DocumentFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "severity": "error" - }, - { - "line": 884, - "column": 42, - "stop_line": 884, - "stop_column": 48, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 892, - "column": 34, - "stop_line": 892, - "stop_column": 40, - "path": "src/documents/tests/test_api_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 83, - "column": 23, - "stop_line": 83, - "stop_column": 49, - "path": "src/documents/tests/test_api_uisettings.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `User` has no attribute `ui_settings`", - "concise_description": "Object of class `User` has no attribute `ui_settings`", - "severity": "error" - }, - { - "line": 99, - "column": 13, - "stop_line": 99, - "stop_column": 48, - "path": "src/documents/tests/test_api_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `pk`", - "concise_description": "Object of class `NoneType` has no attribute `pk`", - "severity": "error" - }, - { - "line": 34, - "column": 13, - "stop_line": 34, - "stop_column": 54, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "severity": "error" - }, - { - "line": 35, - "column": 13, - "stop_line": 35, - "stop_column": 22, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `GetReaderPluginMixin` has no attribute `dirs`", - "concise_description": "Object of class `GetReaderPluginMixin` has no attribute `dirs`", - "severity": "error" - }, - { - "line": 622, - "column": 21, - "stop_line": 622, - "stop_column": 42, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 658, - "column": 5, - "stop_line": 658, - "stop_column": 20, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestAsnBarcode, filepath: Path) -> BarcodePlugin)\n Possible overloads:\n (func: (ParamSpec(_P)) -> Generator[_T_co, None, object]) -> (ParamSpec(_P)) -> _GeneratorContextManager[_T_co] [closest match]\n (func: (ParamSpec(_P)) -> Iterator[_T_co]) -> (ParamSpec(_P)) -> _GeneratorContextManager[_T_co]", - "concise_description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestAsnBarcode, filepath: Path) -> BarcodePlugin)", - "severity": "error" - }, - { - "line": 659, - "column": 45, - "stop_line": 659, - "stop_column": 58, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "bad-return", - "description": "Generator function should return `Generator`", - "concise_description": "Generator function should return `Generator`", - "severity": "error" - }, - { - "line": 663, - "column": 13, - "stop_line": 663, - "stop_column": 54, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "severity": "error" - }, - { - "line": 664, - "column": 13, - "stop_line": 664, - "stop_column": 34, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 817, - "column": 5, - "stop_line": 817, - "stop_column": 20, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestTagBarcode, filepath: Path) -> BarcodePlugin)\n Possible overloads:\n (func: (ParamSpec(_P)) -> Generator[_T_co, None, object]) -> (ParamSpec(_P)) -> _GeneratorContextManager[_T_co] [closest match]\n (func: (ParamSpec(_P)) -> Iterator[_T_co]) -> (ParamSpec(_P)) -> _GeneratorContextManager[_T_co]", - "concise_description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestTagBarcode, filepath: Path) -> BarcodePlugin)", - "severity": "error" - }, - { - "line": 818, - "column": 45, - "stop_line": 818, - "stop_column": 58, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "bad-return", - "description": "Generator function should return `Generator`", - "concise_description": "Generator function should return `Generator`", - "severity": "error" - }, - { - "line": 822, - "column": 13, - "stop_line": 822, - "stop_column": 54, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", - "severity": "error" - }, - { - "line": 823, - "column": 13, - "stop_line": 823, - "stop_column": 34, - "path": "src/documents/tests/test_barcodes.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 73, - "column": 13, - "stop_line": 73, - "stop_column": 23, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", - "concise_description": "Argument `int` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", - "severity": "error" - }, - { - "line": 82, - "column": 81, - "stop_line": 82, - "stop_column": 85, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", - "concise_description": "Argument `None` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", - "severity": "error" - }, - { - "line": 92, - "column": 13, - "stop_line": 92, - "stop_column": 24, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", - "concise_description": "Argument `int` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", - "severity": "error" - }, - { - "line": 101, - "column": 81, - "stop_line": 101, - "stop_column": 85, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", - "concise_description": "Argument `None` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", - "severity": "error" - }, - { - "line": 120, - "column": 13, - "stop_line": 120, - "stop_column": 24, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "severity": "error" - }, - { - "line": 144, - "column": 13, - "stop_line": 144, - "stop_column": 24, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "severity": "error" - }, - { - "line": 151, - "column": 13, - "stop_line": 151, - "stop_column": 17, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "concise_description": "Argument `None` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", - "severity": "error" - }, - { - "line": 242, - "column": 13, - "stop_line": 242, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 246, - "column": 13, - "stop_line": 246, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 302, - "column": 13, - "stop_line": 302, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 306, - "column": 13, - "stop_line": 306, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 310, - "column": 13, - "stop_line": 310, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 314, - "column": 13, - "stop_line": 314, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 318, - "column": 13, - "stop_line": 318, - "stop_column": 36, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 322, - "column": 17, - "stop_line": 322, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 339, - "column": 17, - "stop_line": 339, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 342, - "column": 17, - "stop_line": 342, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 366, - "column": 17, - "stop_line": 366, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 369, - "column": 17, - "stop_line": 369, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 460, - "column": 48, - "stop_line": 460, - "stop_column": 50, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 466, - "column": 26, - "stop_line": 466, - "stop_column": 49, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 504, - "column": 48, - "stop_line": 504, - "stop_column": 50, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 510, - "column": 26, - "stop_line": 510, - "stop_column": 49, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "concise_description": "Object of class `Group` has no attribute `count`\nObject of class `dict` has no attribute `count`", - "severity": "error" - }, - { - "line": 525, - "column": 19, - "stop_line": 525, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 534, - "column": 27, - "stop_line": 534, - "stop_column": 48, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 543, - "column": 19, - "stop_line": 543, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 552, - "column": 27, - "stop_line": 552, - "stop_column": 48, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 561, - "column": 19, - "stop_line": 561, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 594, - "column": 19, - "stop_line": 594, - "stop_column": 40, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 599, - "column": 27, - "stop_line": 599, - "stop_column": 48, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 668, - "column": 24, - "stop_line": 668, - "stop_column": 45, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 904, - "column": 24, - "stop_line": 904, - "stop_column": 45, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1449, - "column": 20, - "stop_line": 1449, - "stop_column": 41, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1525, - "column": 20, - "stop_line": 1525, - "stop_column": 41, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1585, - "column": 20, - "stop_line": 1585, - "stop_column": 41, - "path": "src/documents/tests/test_bulk_edit.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 206, - "column": 18, - "stop_line": 206, - "stop_column": 67, - "path": "src/documents/tests/test_classifier.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `classes_`", - "concise_description": "Object of class `NoneType` has no attribute `classes_`", - "severity": "error" - }, - { - "line": 210, - "column": 18, - "stop_line": 210, - "stop_column": 57, - "path": "src/documents/tests/test_classifier.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `classes_`", - "concise_description": "Object of class `NoneType` has no attribute `classes_`", - "severity": "error" - }, - { - "line": 230, - "column": 23, - "stop_line": 230, - "stop_column": 64, - "path": "src/documents/tests/test_classifier.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `transform`", - "concise_description": "Object of class `NoneType` has no attribute `transform`", - "severity": "error" - }, - { - "line": 461, "column": 40, - "stop_line": 461, - "stop_column": 66, - "path": "src/documents/tests/test_classifier.py", - "code": -2, + "path": "src/documents/tests/search/test_cjk_clause.py", "name": "missing-module-attribute", - "description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", - "concise_description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 481, - "column": 17, - "stop_line": 481, - "stop_column": 25, - "path": "src/documents/tests/test_classifier.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `append`", - "concise_description": "Object of class `NoneType` has no attribute `append`", - "severity": "error" - }, - { - "line": 104, - "column": 16, - "stop_line": 104, - "stop_column": 27, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `Path | None` is not assignable to declared return type `Path`", - "concise_description": "Returned type `Path | None` is not assignable to declared return type `Path`", - "severity": "error" - }, - { - "line": 209, - "column": 15, - "stop_line": 209, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 221, - "column": 15, - "stop_line": 221, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 229, - "column": 15, - "stop_line": 229, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 267, - "column": 27, - "stop_line": 267, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 291, - "column": 28, - "stop_line": 291, - "stop_column": 49, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 358, - "column": 26, - "stop_line": 358, - "stop_column": 51, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, - { - "line": 373, - "column": 26, - "stop_line": 373, - "stop_column": 51, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, - { - "line": 388, - "column": 26, - "stop_line": 388, - "stop_column": 50, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `id`", - "concise_description": "Object of class `NoneType` has no attribute `id`", - "severity": "error" - }, - { - "line": 433, - "column": 56, - "stop_line": 433, - "stop_column": 78, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 438, - "column": 26, - "stop_line": 438, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 440, - "column": 13, - "stop_line": 440, - "stop_column": 35, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 689, - "column": 34, - "stop_line": 689, - "stop_column": 51, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `obj` with type `Sized` in function `len`\n Protocol `Sized` requires attribute `__len__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `obj` with type `Sized` in function `len`", - "severity": "error" - }, - { - "line": 691, - "column": 17, - "stop_line": 691, - "stop_column": 42, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `obj` with type `Sized` in function `len`\n Protocol `Sized` requires attribute `__len__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `obj` with type `Sized` in function `len`", - "severity": "error" - }, - { - "line": 695, - "column": 27, - "stop_line": 695, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 728, - "column": 27, - "stop_line": 728, - "stop_column": 48, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 791, - "column": 13, - "stop_line": 791, - "stop_column": 34, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 801, - "column": 13, - "stop_line": 801, - "stop_column": 34, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 853, - "column": 13, - "stop_line": 853, - "stop_column": 34, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 863, - "column": 13, - "stop_line": 863, - "stop_column": 34, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 906, - "column": 17, - "stop_line": 906, - "stop_column": 38, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 916, - "column": 17, - "stop_line": 916, - "stop_column": 38, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1088, - "column": 26, - "stop_line": 1088, - "stop_column": 39, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filename`", - "concise_description": "Object of class `NoneType` has no attribute `filename`", - "severity": "error" - }, - { - "line": 1089, - "column": 26, - "stop_line": 1089, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_filename`", - "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", - "severity": "error" - }, - { - "line": 1091, - "column": 26, - "stop_line": 1091, - "stop_column": 39, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filename`", - "concise_description": "Object of class `NoneType` has no attribute `filename`", - "severity": "error" - }, - { - "line": 1092, - "column": 26, - "stop_line": 1092, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_filename`", - "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", - "severity": "error" - }, - { - "line": 1094, - "column": 26, - "stop_line": 1094, - "stop_column": 39, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `filename`", - "concise_description": "Object of class `NoneType` has no attribute `filename`", - "severity": "error" - }, - { - "line": 1095, - "column": 26, - "stop_line": 1095, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `archive_filename`", - "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", - "severity": "error" - }, - { - "line": 1191, - "column": 15, - "stop_line": 1191, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1222, - "column": 15, - "stop_line": 1222, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1253, - "column": 15, - "stop_line": 1253, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1286, - "column": 15, - "stop_line": 1286, - "stop_column": 36, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1311, - "column": 26, - "stop_line": 1311, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 1436, - "column": 26, - "stop_line": 1436, - "stop_column": 47, - "path": "src/documents/tests/test_consumer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 32, - "column": 38, - "stop_line": 32, - "stop_column": 63, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `consumption_dir`", - "concise_description": "Class `dirs` has no class attribute `consumption_dir`", - "severity": "error" - }, - { - "line": 33, - "column": 9, - "stop_line": 33, - "stop_column": 35, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `double_sided_dir`", - "concise_description": "Class `dirs` has no class attribute `double_sided_dir`", - "severity": "error" - }, - { - "line": 34, - "column": 29, - "stop_line": 34, - "stop_column": 50, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 42, - "column": 15, - "stop_line": 42, - "stop_column": 41, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `double_sided_dir`", - "concise_description": "Class `dirs` has no class attribute `double_sided_dir`", - "severity": "error" - }, - { - "line": 106, - "column": 18, - "stop_line": 106, - "stop_column": 43, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `consumption_dir`", - "concise_description": "Class `dirs` has no class attribute `consumption_dir`", - "severity": "error" - }, - { - "line": 240, - "column": 21, - "stop_line": 240, - "stop_column": 46, - "path": "src/documents/tests/test_double_sided.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `consumption_dir`", - "concise_description": "Class `dirs` has no class attribute `consumption_dir`", - "severity": "error" - }, - { - "line": 232, - "column": 38, - "stop_line": 232, - "stop_column": 54, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", - "severity": "error" - }, - { - "line": 233, - "column": 9, - "stop_line": 233, - "stop_column": 37, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `write_bytes`", - "concise_description": "Object of class `NoneType` has no attribute `write_bytes`", - "severity": "error" - }, - { - "line": 250, - "column": 27, - "stop_line": 250, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 608, - "column": 18, - "stop_line": 608, - "stop_column": 34, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 691, - "column": 27, - "stop_line": 691, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 711, - "column": 27, - "stop_line": 711, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 738, - "column": 30, - "stop_line": 738, - "stop_column": 46, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "severity": "error" - }, - { - "line": 761, - "column": 27, - "stop_line": 761, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 785, - "column": 27, - "stop_line": 785, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 807, - "column": 27, - "stop_line": 807, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 838, - "column": 27, - "stop_line": 838, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 858, - "column": 27, - "stop_line": 858, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 889, - "column": 27, - "stop_line": 889, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 909, - "column": 27, - "stop_line": 909, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 917, - "column": 30, - "stop_line": 917, - "stop_column": 46, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "severity": "error" - }, - { - "line": 944, - "column": 27, - "stop_line": 944, - "stop_column": 44, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 951, - "column": 27, - "stop_line": 951, - "stop_column": 44, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 977, - "column": 27, - "stop_line": 977, - "stop_column": 43, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 1883, - "column": 31, - "stop_line": 1883, - "stop_column": 48, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 1906, - "column": 31, - "stop_line": 1906, - "stop_column": 48, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 1922, - "column": 31, - "stop_line": 1922, - "stop_column": 48, - "path": "src/documents/tests/test_file_handling.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 166, - "column": 27, - "stop_line": 166, - "stop_column": 40, - "path": "src/documents/tests/test_filters.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal[1698330605] | dict[Any, Any] | list[object] | None` is not assignable to parameter `value` with type `date | datetime | str` in function `documents.templating.filters.localize_date`", - "concise_description": "Argument `Literal[1698330605] | dict[Any, Any] | list[object] | None` is not assignable to parameter `value` with type `date | datetime | str` in function `documents.templating.filters.localize_date`", - "severity": "error" - }, - { - "line": 45, - "column": 39, - "stop_line": 45, - "stop_column": 62, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 51, - "column": 39, - "stop_line": 51, - "stop_column": 62, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 59, - "column": 27, - "stop_line": 59, - "stop_column": 43, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 95, - "column": 39, - "stop_line": 95, - "stop_column": 62, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 96, - "column": 39, - "stop_line": 96, - "stop_column": 62, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 190, - "column": 14, - "stop_line": 190, - "stop_column": 30, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 200, - "column": 30, - "stop_line": 200, - "stop_column": 46, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsNotFile`", - "severity": "error" - }, - { - "line": 202, - "column": 27, - "stop_line": 202, - "stop_column": 44, - "path": "src/documents/tests/test_management.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", - "severity": "error" - }, - { - "line": 63, - "column": 24, - "stop_line": 63, - "stop_column": 52, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-argument", - "description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", - "concise_description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", - "severity": "error" - }, - { - "line": 63, - "column": 24, - "stop_line": 63, - "stop_column": 52, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-argument", - "description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", - "concise_description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", - "severity": "error" - }, - { - "line": 188, - "column": 22, - "stop_line": 188, - "stop_column": 27, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "severity": "error" - }, - { - "line": 196, - "column": 28, - "stop_line": 196, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 199, - "column": 18, - "stop_line": 199, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 303, - "column": 28, - "stop_line": 303, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 306, - "column": 18, - "stop_line": 306, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 315, - "column": 28, - "stop_line": 315, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 318, - "column": 18, - "stop_line": 318, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 417, - "column": 28, - "stop_line": 417, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 420, - "column": 18, - "stop_line": 420, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 456, - "column": 28, - "stop_line": 456, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 459, - "column": 18, - "stop_line": 459, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 486, - "column": 28, - "stop_line": 486, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 489, - "column": 18, - "stop_line": 489, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 521, - "column": 28, - "stop_line": 521, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 524, - "column": 18, - "stop_line": 524, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 546, - "column": 24, - "stop_line": 546, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-argument", - "description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", - "concise_description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", - "severity": "error" - }, - { - "line": 546, - "column": 24, - "stop_line": 546, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-argument", - "description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", - "concise_description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", - "severity": "error" - }, - { - "line": 566, - "column": 28, - "stop_line": 566, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 569, - "column": 18, - "stop_line": 569, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 574, - "column": 22, - "stop_line": 574, - "stop_column": 27, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "severity": "error" - }, - { - "line": 598, - "column": 28, - "stop_line": 598, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 601, - "column": 18, - "stop_line": 601, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 609, - "column": 26, - "stop_line": 609, - "stop_column": 31, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "severity": "error" - }, - { - "line": 637, - "column": 28, - "stop_line": 637, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 640, - "column": 18, - "stop_line": 640, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 654, - "column": 22, - "stop_line": 654, - "stop_column": 27, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", - "severity": "error" - }, - { - "line": 735, - "column": 28, - "stop_line": 735, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 738, - "column": 18, - "stop_line": 738, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 781, - "column": 28, - "stop_line": 781, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 784, - "column": 18, - "stop_line": 784, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 829, - "column": 28, - "stop_line": 829, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 832, - "column": 18, - "stop_line": 832, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 865, - "column": 28, - "stop_line": 865, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 868, - "column": 18, - "stop_line": 868, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 895, - "column": 28, - "stop_line": 895, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 898, - "column": 18, - "stop_line": 898, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 925, - "column": 28, - "stop_line": 925, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 928, - "column": 18, - "stop_line": 928, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 965, - "column": 28, - "stop_line": 965, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 968, - "column": 18, - "stop_line": 968, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 988, - "column": 28, - "stop_line": 988, - "stop_column": 47, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 991, - "column": 18, - "stop_line": 991, - "stop_column": 37, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 1000, - "column": 13, - "stop_line": 1000, - "stop_column": 54, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `QuerySet` has no attribute `hard_delete`", - "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", - "severity": "error" - }, - { - "line": 1035, - "column": 23, - "stop_line": 1035, - "stop_column": 42, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 1038, - "column": 13, - "stop_line": 1038, - "stop_column": 32, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 1048, - "column": 23, - "stop_line": 1048, - "stop_column": 42, - "path": "src/documents/tests/test_management_exporter.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 43, - "column": 21, - "stop_line": 43, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 62, - "column": 25, - "stop_line": 62, - "stop_column": 46, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 70, - "column": 21, - "stop_line": 70, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 89, - "column": 25, - "stop_line": 89, - "stop_column": 46, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 100, - "column": 21, - "stop_line": 100, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 217, - "column": 10, - "stop_line": 217, - "stop_column": 33, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 219, - "column": 10, - "stop_line": 219, - "stop_column": 33, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 227, - "column": 21, - "stop_line": 227, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 256, - "column": 21, - "stop_line": 256, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 293, - "column": 21, - "stop_line": 293, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 314, - "column": 10, - "stop_line": 314, - "stop_column": 31, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 321, - "column": 21, - "stop_line": 321, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 341, - "column": 10, - "stop_line": 341, - "stop_column": 31, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 342, - "column": 10, - "stop_line": 342, - "stop_column": 31, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 351, - "column": 21, - "stop_line": 351, - "stop_column": 42, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 372, - "column": 20, - "stop_line": 372, - "stop_column": 41, - "path": "src/documents/tests/test_management_importer.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 58, - "column": 12, - "stop_line": 58, - "stop_column": 25, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[StoragePathFactory, StoragePathFactory, StoragePathFactory]` is not assignable to declared return type `tuple[StoragePath, StoragePath, StoragePath]`", - "concise_description": "Returned type `tuple[StoragePathFactory, StoragePathFactory, StoragePathFactory]` is not assignable to declared return type `tuple[StoragePath, StoragePath, StoragePath]`", - "severity": "error" - }, - { - "line": 69, - "column": 12, - "stop_line": 69, - "stop_column": 68, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[TagFactory, TagFactory, TagFactory, TagFactory, TagFactory]` is not assignable to declared return type `tuple[Tag, Tag, Tag, Tag, Tag]`", - "concise_description": "Returned type `tuple[TagFactory, TagFactory, TagFactory, TagFactory, TagFactory]` is not assignable to declared return type `tuple[Tag, Tag, Tag, Tag, Tag]`", - "severity": "error" - }, - { - "line": 83, - "column": 12, - "stop_line": 83, - "stop_column": 29, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[CorrespondentFactory, CorrespondentFactory]` is not assignable to declared return type `tuple[Correspondent, Correspondent]`", - "concise_description": "Returned type `tuple[CorrespondentFactory, CorrespondentFactory]` is not assignable to declared return type `tuple[Correspondent, Correspondent]`", - "severity": "error" - }, - { - "line": 97, - "column": 12, - "stop_line": 97, - "stop_column": 31, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[DocumentTypeFactory, DocumentTypeFactory]` is not assignable to declared return type `tuple[DocumentType, DocumentType]`", - "concise_description": "Returned type `tuple[DocumentTypeFactory, DocumentTypeFactory]` is not assignable to declared return type `tuple[DocumentType, DocumentType]`", - "severity": "error" - }, - { - "line": 116, - "column": 5, - "stop_line": 116, - "stop_column": 12, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `tags`", - "concise_description": "Object of class `DocumentFactory` has no attribute `tags`", - "severity": "error" - }, - { - "line": 117, - "column": 5, - "stop_line": 117, - "stop_column": 12, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `tags`", - "concise_description": "Object of class `DocumentFactory` has no attribute `tags`", - "severity": "error" - }, - { - "line": 119, - "column": 12, - "stop_line": 119, - "stop_column": 26, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `tuple[DocumentFactory, DocumentFactory, DocumentFactory, DocumentFactory]` is not assignable to declared return type `tuple[Document, Document, Document, Document]`", - "concise_description": "Returned type `tuple[DocumentFactory, DocumentFactory, DocumentFactory, DocumentFactory]` is not assignable to declared return type `tuple[Document, Document, Document, Document]`", - "severity": "error" - }, - { - "line": 265, - "column": 9, - "stop_line": 265, - "stop_column": 28, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 337, - "column": 9, - "stop_line": 337, - "stop_column": 28, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 416, - "column": 9, - "stop_line": 416, - "stop_column": 28, - "path": "src/documents/tests/test_management_retagger.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `DocumentFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 89, - "column": 9, - "stop_line": 89, - "stop_column": 34, - "path": "src/documents/tests/test_migration_sha256_checksums.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `TestMigrations` has no attribute `_fixture_teardown`", - "concise_description": "Object of class `TestMigrations` has no attribute `_fixture_teardown`", - "severity": "error" - }, - { - "line": 25, - "column": 30, - "stop_line": 25, - "stop_column": 74, - "path": "src/documents/tests/test_models.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 30, - "column": 27, - "stop_line": 30, - "stop_column": 71, - "path": "src/documents/tests/test_models.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `correspondent`", - "concise_description": "Object of class `NoneType` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 38, - "column": 17, - "stop_line": 38, - "stop_column": 73, - "path": "src/documents/tests/test_parsers.py", - "code": -2, - "name": "not-callable", - "description": "Expected a callable, got `None`", - "concise_description": "Expected a callable, got `None`", - "severity": "error" - }, - { - "line": 62, - "column": 17, - "stop_line": 62, - "stop_column": 73, - "path": "src/documents/tests/test_parsers.py", - "code": -2, - "name": "not-callable", - "description": "Expected a callable, got `None`", - "concise_description": "Expected a callable, got `None`", - "severity": "error" - }, - { - "line": 96, - "column": 21, - "stop_line": 96, - "stop_column": 77, - "path": "src/documents/tests/test_parsers.py", - "code": -2, - "name": "not-callable", - "description": "Expected a callable, got `None`", - "concise_description": "Expected a callable, got `None`", - "severity": "error" - }, - { - "line": 132, - "column": 14, - "stop_line": 132, - "stop_column": 37, - "path": "src/documents/tests/test_sanity_check.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 151, - "column": 24, - "stop_line": 151, - "stop_column": 47, - "path": "src/documents/tests/test_sanity_check.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 164, - "column": 14, - "stop_line": 164, - "stop_column": 37, - "path": "src/documents/tests/test_sanity_check.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 127, - "column": 28, - "stop_line": 127, - "stop_column": 47, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 141, - "column": 28, - "stop_line": 141, - "stop_column": 54, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", - "concise_description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", - "severity": "error" - }, - { - "line": 202, - "column": 29, - "stop_line": 202, - "stop_column": 48, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 206, - "column": 28, - "stop_line": 206, - "stop_column": 47, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 440, - "column": 30, - "stop_line": 440, - "stop_column": 49, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 443, - "column": 26, - "stop_line": 443, - "stop_column": 59, - "path": "src/documents/tests/test_share_link_bundles.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `resolve`", - "concise_description": "Object of class `NoneType` has no attribute `resolve`", - "severity": "error" - }, - { - "line": 96, - "column": 23, - "stop_line": 96, - "stop_column": 35, - "path": "src/documents/tests/test_tag_hierarchy.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "severity": "error" - }, - { - "line": 109, - "column": 23, - "stop_line": 109, - "stop_column": 35, - "path": "src/documents/tests/test_tag_hierarchy.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "severity": "error" - }, - { - "line": 196, - "column": 9, - "stop_line": 196, - "stop_column": 29, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 198, - "column": 16, - "stop_line": 198, - "stop_column": 33, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `date_started`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_started`", - "severity": "error" - }, - { - "line": 216, - "column": 16, - "stop_line": 220, - "stop_column": 10, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `PaperlessTaskFactory` is not assignable to declared return type `PaperlessTask`", - "concise_description": "Returned type `PaperlessTaskFactory` is not assignable to declared return type `PaperlessTask`", - "severity": "error" - }, - { - "line": 309, - "column": 9, - "stop_line": 309, - "stop_column": 29, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 311, - "column": 16, - "stop_line": 311, - "stop_column": 46, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 312, - "column": 16, - "stop_line": 312, - "stop_column": 49, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 313, - "column": 16, - "stop_line": 313, - "stop_column": 30, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", - "severity": "error" - }, - { - "line": 334, - "column": 9, - "stop_line": 334, - "stop_column": 29, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 335, - "column": 16, - "stop_line": 335, - "stop_column": 47, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `Literal['traceback']` and `None`", - "concise_description": "`in` is not supported between `Literal['traceback']` and `None`", - "severity": "error" - }, - { - "line": 336, - "column": 20, - "stop_line": 336, - "stop_column": 49, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 353, - "column": 9, - "stop_line": 353, - "stop_column": 29, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 354, - "column": 16, - "stop_line": 354, - "stop_column": 37, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `duration_seconds`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `duration_seconds`", - "severity": "error" - }, - { - "line": 355, - "column": 16, - "stop_line": 355, - "stop_column": 38, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `wait_time_seconds`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `wait_time_seconds`", - "severity": "error" - }, - { - "line": 371, - "column": 9, - "stop_line": 371, - "stop_column": 29, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 373, - "column": 16, - "stop_line": 373, - "stop_column": 30, - "path": "src/documents/tests/test_task_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", - "concise_description": "Object of class `PaperlessTaskFactory` has no attribute `date_done`", - "severity": "error" - }, - { - "line": 228, - "column": 19, - "stop_line": 228, - "stop_column": 40, - "path": "src/documents/tests/test_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 237, - "column": 27, - "stop_line": 237, - "stop_column": 48, - "path": "src/documents/tests/test_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 269, - "column": 19, - "stop_line": 269, - "stop_column": 40, - "path": "src/documents/tests/test_tasks.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 46, - "column": 26, - "stop_line": 46, - "stop_column": 38, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "severity": "error" - }, - { - "line": 71, - "column": 17, - "stop_line": 71, - "stop_column": 53, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 75, - "column": 17, - "stop_line": 75, - "stop_column": 52, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 79, - "column": 17, - "stop_line": 79, - "stop_column": 52, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 83, - "column": 17, - "stop_line": 83, - "stop_column": 54, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 87, - "column": 17, - "stop_line": 87, - "stop_column": 49, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 102, - "column": 9, - "stop_line": 102, - "stop_column": 24, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", - "severity": "error" - }, - { - "line": 103, - "column": 9, - "stop_line": 103, - "stop_column": 20, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 108, - "column": 26, - "stop_line": 108, - "stop_column": 41, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", - "severity": "error" - }, - { - "line": 125, - "column": 44, - "stop_line": 125, - "stop_column": 67, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 164, - "column": 9, - "stop_line": 164, - "stop_column": 24, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", - "severity": "error" - }, - { - "line": 173, - "column": 9, - "stop_line": 173, - "stop_column": 24, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", - "severity": "error" - }, - { - "line": 374, - "column": 13, - "stop_line": 377, - "stop_column": 26, - "path": "src/documents/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `suggestions`", - "concise_description": "Object of class `NoneType` has no attribute `suggestions`", - "severity": "error" - }, - { - "line": 140, - "column": 30, - "stop_line": 140, - "stop_column": 51, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 176, - "column": 13, - "stop_line": 176, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 207, - "column": 25, - "stop_line": 209, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 224, - "column": 25, - "stop_line": 226, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 235, - "column": 26, - "stop_line": 235, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 239, - "column": 21, - "stop_line": 239, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 288, - "column": 13, - "stop_line": 288, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 319, - "column": 25, - "stop_line": 321, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 336, - "column": 25, - "stop_line": 338, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 363, - "column": 30, - "stop_line": 363, - "stop_column": 51, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 407, - "column": 13, - "stop_line": 407, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 459, - "column": 29, - "stop_line": 459, - "stop_column": 50, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 476, - "column": 13, - "stop_line": 476, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 529, - "column": 13, - "stop_line": 529, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 552, - "column": 28, - "stop_line": 552, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 555, - "column": 46, - "stop_line": 555, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 561, - "column": 28, - "stop_line": 561, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 564, - "column": 46, - "stop_line": 564, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 570, - "column": 45, - "stop_line": 570, - "stop_column": 59, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `str` has no attribute `name`", - "concise_description": "Object of class `str` has no attribute `name`", - "severity": "error" - }, - { - "line": 606, - "column": 13, - "stop_line": 606, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 629, - "column": 28, - "stop_line": 629, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 632, - "column": 46, - "stop_line": 632, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 638, - "column": 28, - "stop_line": 638, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 641, - "column": 46, - "stop_line": 641, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 685, - "column": 13, - "stop_line": 685, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 709, - "column": 28, - "stop_line": 709, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 712, - "column": 46, - "stop_line": 712, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 718, - "column": 28, - "stop_line": 718, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 721, - "column": 46, - "stop_line": 721, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 763, - "column": 13, - "stop_line": 763, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 786, - "column": 28, - "stop_line": 786, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 789, - "column": 46, - "stop_line": 789, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 795, - "column": 28, - "stop_line": 795, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 798, - "column": 46, - "stop_line": 798, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 874, - "column": 13, - "stop_line": 874, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 889, - "column": 26, - "stop_line": 889, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 950, - "column": 31, - "stop_line": 950, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 1422, - "column": 40, - "stop_line": 1422, - "stop_column": 46, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, - { - "line": 1438, - "column": 35, - "stop_line": 1438, - "stop_column": 41, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, - { - "line": 1457, - "column": 39, - "stop_line": 1457, - "stop_column": 45, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", - "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", - "severity": "error" - }, - { - "line": 1922, - "column": 26, - "stop_line": 1922, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1947, - "column": 13, - "stop_line": 1947, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 2006, - "column": 26, - "stop_line": 2006, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 2055, - "column": 43, - "stop_line": 2058, - "stop_column": 10, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 2059, - "column": 45, - "stop_line": 2062, - "stop_column": 10, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 2070, - "column": 38, - "stop_line": 2070, - "stop_column": 64, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 2833, - "column": 26, - "stop_line": 2833, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 2836, - "column": 38, - "stop_line": 2836, - "stop_column": 64, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 2904, - "column": 26, - "stop_line": 2904, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 2907, - "column": 38, - "stop_line": 2907, - "stop_column": 64, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 2971, - "column": 13, - "stop_line": 2971, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3006, - "column": 25, - "stop_line": 3008, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 3023, - "column": 25, - "stop_line": 3025, - "stop_column": 26, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", - "severity": "error" - }, - { - "line": 3034, - "column": 26, - "stop_line": 3034, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 3095, - "column": 13, - "stop_line": 3095, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3119, - "column": 28, - "stop_line": 3119, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 3122, - "column": 46, - "stop_line": 3122, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 3128, - "column": 28, - "stop_line": 3128, - "stop_column": 30, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `list.count`", - "concise_description": "Missing positional argument `value` in function `list.count`", - "severity": "error" - }, - { - "line": 3131, - "column": 46, - "stop_line": 3131, - "stop_column": 77, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-assignment", - "description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", - "severity": "error" - }, - { - "line": 3134, - "column": 21, - "stop_line": 3134, - "stop_column": 43, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 3246, - "column": 13, - "stop_line": 3246, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3258, - "column": 27, - "stop_line": 3258, - "stop_column": 44, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | Unknown` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `str | Unknown` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "severity": "error" - }, - { - "line": 3346, - "column": 13, - "stop_line": 3346, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3384, - "column": 13, - "stop_line": 3384, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3604, - "column": 13, - "stop_line": 3604, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3726, - "column": 13, - "stop_line": 3726, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 3975, - "column": 23, - "stop_line": 3975, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 3993, - "column": 23, - "stop_line": 3993, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4018, - "column": 27, - "stop_line": 4018, - "stop_column": 31, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4066, - "column": 13, - "stop_line": 4066, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 4115, - "column": 23, - "stop_line": 4115, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "severity": "error" - }, - { - "line": 4164, - "column": 23, - "stop_line": 4164, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "severity": "error" - }, - { - "line": 4196, - "column": 23, - "stop_line": 4196, - "stop_column": 35, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", - "severity": "error" - }, - { - "line": 4409, - "column": 13, - "stop_line": 4409, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 4601, - "column": 13, - "stop_line": 4601, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 4665, - "column": 13, - "stop_line": 4665, - "stop_column": 34, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 4714, - "column": 19, - "stop_line": 4714, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4717, - "column": 16, - "stop_line": 4717, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 4727, - "column": 19, - "stop_line": 4727, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4730, - "column": 16, - "stop_line": 4730, - "stop_column": 48, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 4767, - "column": 23, - "stop_line": 4767, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4776, - "column": 23, - "stop_line": 4776, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4795, - "column": 23, - "stop_line": 4795, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4822, - "column": 23, - "stop_line": 4822, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4846, - "column": 19, - "stop_line": 4846, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4851, - "column": 16, - "stop_line": 4851, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 4852, - "column": 16, - "stop_line": 4852, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 4876, - "column": 23, - "stop_line": 4876, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4902, - "column": 19, - "stop_line": 4902, - "stop_column": 23, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", - "severity": "error" - }, - { - "line": 4907, - "column": 16, - "stop_line": 4907, - "stop_column": 27, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 4908, - "column": 35, - "stop_line": 4908, - "stop_column": 46, - "path": "src/documents/tests/test_workflows.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 41, - "column": 22, - "stop_line": 41, - "stop_column": 35, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `data_dir`", - "concise_description": "Class `dirs` has no class attribute `data_dir`", - "severity": "error" - }, - { - "line": 42, - "column": 26, - "stop_line": 42, - "stop_column": 40, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 43, - "column": 26, - "stop_line": 43, - "stop_column": 40, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 44, - "column": 24, - "stop_line": 44, - "stop_column": 38, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 45, - "column": 24, - "stop_line": 45, - "stop_column": 37, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `data_dir`", - "concise_description": "Class `dirs` has no class attribute `data_dir`", - "severity": "error" - }, - { - "line": 47, - "column": 5, - "stop_line": 47, - "stop_column": 19, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `index_dir`", - "concise_description": "Class `dirs` has no class attribute `index_dir`", - "severity": "error" - }, - { - "line": 48, - "column": 5, - "stop_line": 48, - "stop_column": 23, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 49, - "column": 5, - "stop_line": 49, - "stop_column": 23, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `thumbnail_dir`", - "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", - "severity": "error" - }, - { - "line": 50, - "column": 5, - "stop_line": 50, - "stop_column": 21, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 51, - "column": 5, - "stop_line": 51, - "stop_column": 21, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `logging_dir`", - "concise_description": "Class `dirs` has no class attribute `logging_dir`", - "severity": "error" - }, - { - "line": 54, - "column": 18, - "stop_line": 54, - "stop_column": 31, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `data_dir`", - "concise_description": "Class `dirs` has no class attribute `data_dir`", - "severity": "error" - }, - { - "line": 55, - "column": 21, - "stop_line": 55, - "stop_column": 37, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `scratch_dir`", - "concise_description": "Class `dirs` has no class attribute `scratch_dir`", - "severity": "error" - }, - { - "line": 56, - "column": 20, - "stop_line": 56, - "stop_column": 34, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 57, - "column": 23, - "stop_line": 57, - "stop_column": 41, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `originals_dir`", - "concise_description": "Class `dirs` has no class attribute `originals_dir`", - "severity": "error" - }, - { - "line": 58, - "column": 23, - "stop_line": 58, - "stop_column": 41, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `thumbnail_dir`", - "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", - "severity": "error" - }, - { - "line": 59, - "column": 21, - "stop_line": 59, - "stop_column": 37, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `archive_dir`", - "concise_description": "Class `dirs` has no class attribute `archive_dir`", - "severity": "error" - }, - { - "line": 60, - "column": 25, - "stop_line": 60, - "stop_column": 45, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `consumption_dir`", - "concise_description": "Class `dirs` has no class attribute `consumption_dir`", - "severity": "error" - }, - { - "line": 61, - "column": 21, - "stop_line": 61, - "stop_column": 37, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `logging_dir`", - "concise_description": "Class `dirs` has no class attribute `logging_dir`", - "severity": "error" - }, - { - "line": 62, - "column": 19, - "stop_line": 62, - "stop_column": 33, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `index_dir`", - "concise_description": "Class `dirs` has no class attribute `index_dir`", - "severity": "error" - }, - { - "line": 63, - "column": 21, - "stop_line": 63, - "stop_column": 36, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `static_dir`", - "concise_description": "Class `dirs` has no class attribute `static_dir`", - "severity": "error" - }, - { - "line": 64, - "column": 20, - "stop_line": 64, - "stop_column": 33, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `data_dir`", - "concise_description": "Class `dirs` has no class attribute `data_dir`", - "severity": "error" - }, - { - "line": 65, - "column": 20, - "stop_line": 65, - "stop_column": 34, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `media_dir`", - "concise_description": "Class `dirs` has no class attribute `media_dir`", - "severity": "error" - }, - { - "line": 67, - "column": 5, - "stop_line": 67, - "stop_column": 27, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `dirs` has no class attribute `settings_override`", - "concise_description": "Class `dirs` has no class attribute `settings_override`", - "severity": "error" - }, - { - "line": 164, - "column": 9, - "stop_line": 164, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `setUp`", - "concise_description": "Object of class `object` has no attribute `setUp`", - "severity": "error" - }, - { - "line": 169, - "column": 9, - "stop_line": 169, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `tearDown`", - "concise_description": "Object of class `object` has no attribute `tearDown`", - "severity": "error" - }, - { - "line": 180, - "column": 9, - "stop_line": 180, - "stop_column": 24, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "severity": "error" - }, - { - "line": 183, - "column": 9, - "stop_line": 183, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", - "severity": "error" - }, - { - "line": 186, - "column": 9, - "stop_line": 186, - "stop_column": 24, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "severity": "error" - }, - { - "line": 189, - "column": 9, - "stop_line": 189, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", - "severity": "error" - }, - { - "line": 203, - "column": 9, - "stop_line": 203, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", - "severity": "error" - }, - { - "line": 207, - "column": 9, - "stop_line": 207, - "stop_column": 24, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", - "severity": "error" - }, - { - "line": 209, - "column": 9, - "stop_line": 209, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", - "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", - "severity": "error" - }, - { - "line": 227, - "column": 9, - "stop_line": 227, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `setUp`", - "concise_description": "Object of class `object` has no attribute `setUp`", - "severity": "error" - }, - { - "line": 230, - "column": 9, - "stop_line": 230, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `tearDown`", - "concise_description": "Object of class `object` has no attribute `tearDown`", - "severity": "error" - }, - { - "line": 245, - "column": 9, - "stop_line": 245, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `setUp`", - "concise_description": "Object of class `object` has no attribute `setUp`", - "severity": "error" - }, - { - "line": 248, - "column": 9, - "stop_line": 248, - "stop_column": 25, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `tearDown`", - "concise_description": "Object of class `object` has no attribute `tearDown`", - "severity": "error" - }, - { - "line": 272, - "column": 16, - "stop_line": 272, - "stop_column": 74, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `name`", - "concise_description": "Object of class `NoneType` has no attribute `name`", - "severity": "error" - }, - { - "line": 353, - "column": 13, - "stop_line": 353, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "severity": "error" - }, - { - "line": 361, - "column": 13, - "stop_line": 361, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "severity": "error" - }, - { - "line": 369, - "column": 13, - "stop_line": 369, - "stop_column": 22, - "path": "src/documents/tests/utils.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", - "severity": "error" - }, - { - "line": 86, - "column": 34, - "stop_line": 86, - "stop_column": 45, - "path": "src/documents/utils.py", - "code": -2, - "name": "bad-assignment", - "description": "`float | int | None` is not assignable to attribute `MAX_IMAGE_PIXELS` with type `int | None`", - "concise_description": "`float | int | None` is not assignable to attribute `MAX_IMAGE_PIXELS` with type `int | None`", - "severity": "error" - }, - { - "line": 289, - "column": 31, - "stop_line": 289, - "stop_column": 57, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `username`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `username`", - "severity": "error" - }, - { - "line": 290, "column": 32, - "stop_line": 290, - "stop_column": 63, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `get_full_name`\nObject of class `AnonymousUser` has no attribute `get_full_name`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `get_full_name`\nObject of class `AnonymousUser` has no attribute `get_full_name`", + "path": "src/documents/tests/search/test_cjk_clause.py", + "name": "bad-argument-type", + "concise_description": "Argument `TestCjkParseFailureDegradesGracefully.test_a_cjk_run_tantivy_cannot_parse_drops_the_clause_only._RaisingIndex` is not assignable to parameter `index` with type `Index` in function `documents.search._query._parse_cjk_text`", "severity": "error" }, { - "line": 345, - "column": 17, - "stop_line": 345, - "stop_column": 30, - "path": "src/documents/views.py", - "code": -2, + "column": 33, + "path": "src/documents/tests/search/test_cjk_clause.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `index` with type `Index` in function `documents.search._query._build_cjk_query`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/tests/search/test_cjk_emit_registry.py", + "name": "not-callable", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "column": 20, + "path": "src/documents/tests/search/test_cjk_emit_registry.py", "name": "missing-attribute", - "description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", - "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 377, "column": 19, - "stop_line": 377, - "stop_column": 49, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `get_serializer_context`", - "concise_description": "Object of class `object` has no attribute `get_serializer_context`", + "path": "src/documents/tests/search/test_cjk_leaf_rewrite.py", + "name": "not-callable", + "concise_description": "Expected a callable, got `None`", "severity": "error" }, { - "line": 380, - "column": 21, - "stop_line": 380, - "stop_column": 33, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BulkPermissionMixin` has no attribute `request`", - "concise_description": "Object of class `BulkPermissionMixin` has no attribute `request`", - "severity": "error" - }, - { - "line": 395, - "column": 24, - "stop_line": 395, - "stop_column": 44, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BulkPermissionMixin` has no attribute `filter_queryset`", - "concise_description": "Object of class `BulkPermissionMixin` has no attribute `filter_queryset`", - "severity": "error" - }, - { - "line": 395, - "column": 45, - "stop_line": 395, - "stop_column": 62, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BulkPermissionMixin` has no attribute `get_queryset`", - "concise_description": "Object of class `BulkPermissionMixin` has no attribute `get_queryset`", - "severity": "error" - }, - { - "line": 397, - "column": 22, - "stop_line": 397, - "stop_column": 35, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", - "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", - "severity": "error" - }, - { - "line": 499, - "column": 29, - "stop_line": 499, - "stop_column": 51, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `annotate`", - "concise_description": "Object of class `NoneType` has no attribute `annotate`", - "severity": "error" - }, - { - "line": 505, - "column": 25, - "stop_line": 505, - "stop_column": 47, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `annotate`", - "concise_description": "Object of class `NoneType` has no attribute `annotate`", - "severity": "error" - }, - { - "line": 930, - "column": 48, - "stop_line": 930, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Correspondent` has no attribute `document_count`", - "concise_description": "Object of class `Correspondent` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 933, - "column": 48, - "stop_line": 933, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Tag` has no attribute `document_count`", - "concise_description": "Object of class `Tag` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 936, - "column": 48, - "stop_line": 936, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentType` has no attribute `document_count`", - "concise_description": "Object of class `DocumentType` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 939, - "column": 48, - "stop_line": 939, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `StoragePath` has no attribute `document_count`", - "concise_description": "Object of class `StoragePath` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 942, - "column": 48, - "stop_line": 942, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CustomField` has no attribute `document_count`", - "concise_description": "Object of class `CustomField` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 1115, - "column": 9, - "stop_line": 1115, - "stop_column": 16, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `DocumentViewSet.destroy` overrides parent class `DestroyModelMixin` in an inconsistent manner\n `DocumentViewSet.destroy` has type `(self: DocumentViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response`, which is not assignable to `(self: DocumentViewSet, request: Request, *args: Any, **kwargs: Any) -> Response`, the type of `DestroyModelMixin.destroy`\n Signature mismatch:\n ...umentViewSet, request: Request, *args: Any, **kwargs: Any) -> Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ return type\n |\n parameters\n ...umentViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", - "concise_description": "Class member `DocumentViewSet.destroy` overrides parent class `DestroyModelMixin` in an inconsistent manner", - "severity": "error" - }, - { - "line": 1269, - "column": 37, - "stop_line": 1269, - "stop_column": 54, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[MetadataEntry] | list[Unknown] | None` is not assignable to parameter `original_metadata` with type `list[Unknown]` in function `documents.caching.set_metadata_cache`", - "concise_description": "Argument `list[MetadataEntry] | list[Unknown] | None` is not assignable to parameter `original_metadata` with type `list[Unknown]` in function `documents.caching.set_metadata_cache`", - "severity": "error" - }, - { - "line": 1383, - "column": 45, - "stop_line": 1383, - "stop_column": 57, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Any | None` is not assignable to parameter `filename` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", - "concise_description": "Argument `Any | None` is not assignable to parameter `filename` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", - "severity": "error" - }, - { - "line": 1396, - "column": 61, - "stop_line": 1396, - "stop_column": 71, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", - "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", - "severity": "error" - }, - { - "line": 1398, - "column": 56, - "stop_line": 1398, - "stop_column": 66, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", - "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", - "severity": "error" - }, - { - "line": 1400, - "column": 63, - "stop_line": 1400, - "stop_column": 73, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", - "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", - "severity": "error" - }, - { - "line": 1403, - "column": 62, - "stop_line": 1403, - "stop_column": 72, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", - "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", - "severity": "error" - }, - { - "line": 1517, - "column": 21, - "stop_line": 1517, - "stop_column": 48, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 1559, - "column": 17, - "stop_line": 1559, - "stop_column": 44, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 1586, - "column": 5, - "stop_line": 1586, - "stop_column": 62, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-specialization", - "description": "`(self: Self@DocumentViewSet, request: Unknown, pk: Unknown | None = None) -> HttpResponseForbidden | Response | None` is not assignable to upper bound `(...) -> HttpResponseBase` of type variable `_View`", - "concise_description": "`(self: Self@DocumentViewSet, request: Unknown, pk: Unknown | None = None) -> HttpResponseForbidden | Response | None` is not assignable to upper bound `(...) -> HttpResponseBase` of type variable `_View`", - "severity": "error" - }, - { - "line": 1643, - "column": 26, - "stop_line": 1643, - "stop_column": 57, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `get_for_object`", - "concise_description": "Object of class `Manager` has no attribute `get_for_object`", - "severity": "error" - }, - { - "line": 1649, - "column": 22, - "stop_line": 1649, - "stop_column": 54, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `get_for_objects`", - "concise_description": "Object of class `Manager` has no attribute `get_for_objects`", - "severity": "error" - }, - { - "line": 1650, - "column": 13, - "stop_line": 1650, - "stop_column": 30, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 1688, - "column": 36, - "stop_line": 1688, - "stop_column": 64, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-argument", - "description": "Missing argument `request` in function `DocumentViewSet.email_documents`", - "concise_description": "Missing argument `request` in function `DocumentViewSet.email_documents`", - "severity": "error" - }, - { - "line": 1728, - "column": 30, - "stop_line": 1728, - "stop_column": 45, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.mail.EmailAttachment.__init__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.mail.EmailAttachment.__init__`", - "severity": "error" - }, - { - "line": 1897, - "column": 13, - "stop_line": 1897, - "stop_column": 40, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 1976, - "column": 13, - "stop_line": 1976, - "stop_column": 40, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 2052, - "column": 70, - "stop_line": 2052, - "stop_column": 79, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `QuerySet[Any, Any] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", - "concise_description": "Argument `QuerySet[Any, Any] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", - "severity": "error" - }, - { - "line": 2121, - "column": 9, - "stop_line": 2121, - "stop_column": 13, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `UnifiedSearchViewSet.list` overrides parent class `DocumentViewSet` in an inconsistent manner\n `UnifiedSearchViewSet.list` has type `(self: UnifiedSearchViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | HttpResponseForbidden | Response`, which is not assignable to `(self: UnifiedSearchViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> Response`, the type of `DocumentViewSet.list`\n Signature mismatch:\n ...s: Unknown, **kwargs: Unknown) -> Response: ...\n ^ return type\n ...s: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | HttpResponseForbidden | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type", - "concise_description": "Class member `UnifiedSearchViewSet.list` overrides parent class `DocumentViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 2160, - "column": 17, - "stop_line": 2160, - "stop_column": 45, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BasePagination` has no attribute `get_page_size`\nObject of class `NoneType` has no attribute `get_page_size`", - "concise_description": "Object of class `BasePagination` has no attribute `get_page_size`\nObject of class `NoneType` has no attribute `get_page_size`", - "severity": "error" - }, - { - "line": 2160, - "column": 58, - "stop_line": 2160, - "stop_column": 82, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BasePagination` has no attribute `page_size`\nObject of class `NoneType` has no attribute `page_size`", - "concise_description": "Object of class `BasePagination` has no attribute `page_size`\nObject of class `NoneType` has no attribute `page_size`", - "severity": "error" - }, - { - "line": 2298, - "column": 43, - "stop_line": 2298, - "stop_column": 45, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `TantivyRelevanceList` is not assignable to parameter `queryset` with type `QuerySet[Any, @_]` in function `rest_framework.generics.GenericAPIView.paginate_queryset`", - "concise_description": "Argument `TantivyRelevanceList` is not assignable to parameter `queryset` with type `QuerySet[Any, @_]` in function `rest_framework.generics.GenericAPIView.paginate_queryset`", - "severity": "error" - }, - { - "line": 2343, - "column": 25, - "stop_line": 2343, - "stop_column": 36, - "path": "src/documents/views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`+` is not supported between `None` and `Literal[1]`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__radd__`", - "concise_description": "`+` is not supported between `None` and `Literal[1]`", - "severity": "error" - }, - { - "line": 2572, - "column": 18, - "stop_line": 2572, - "stop_column": 35, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", - "severity": "error" - }, - { - "line": 2593, - "column": 18, - "stop_line": 2593, - "stop_column": 22, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", - "severity": "error" - }, - { - "line": 2676, - "column": 18, - "stop_line": 2676, - "stop_column": 22, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", - "severity": "error" - }, - { - "line": 2688, - "column": 18, - "stop_line": 2688, - "stop_column": 22, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", - "severity": "error" - }, - { - "line": 2717, - "column": 33, - "stop_line": 2717, - "stop_column": 46, - "path": "src/documents/views.py", - "code": -2, - "name": "unbound-name", - "description": "`old_documents` may be uninitialized", - "concise_description": "`old_documents` may be uninitialized", - "severity": "error" - }, - { - "line": 2727, - "column": 21, - "stop_line": 2727, - "stop_column": 48, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Manager` has no attribute `log_create`", - "concise_description": "Object of class `Manager` has no attribute `log_create`", - "severity": "error" - }, - { - "line": 3108, - "column": 52, - "stop_line": 3108, - "stop_column": 68, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Correspondent` has no attribute `document_count`", - "concise_description": "Object of class `Correspondent` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 3112, - "column": 52, - "stop_line": 3112, - "stop_column": 68, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Tag` has no attribute `document_count`", - "concise_description": "Object of class `Tag` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 3115, - "column": 52, - "stop_line": 3115, - "stop_column": 68, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentType` has no attribute `document_count`", - "concise_description": "Object of class `DocumentType` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 3118, - "column": 52, - "stop_line": 3118, - "stop_column": 68, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `StoragePath` has no attribute `document_count`", - "concise_description": "Object of class `StoragePath` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 3122, - "column": 52, - "stop_line": 3122, - "stop_column": 68, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CustomField` has no attribute `document_count`", - "concise_description": "Object of class `CustomField` has no attribute `document_count`", - "severity": "error" - }, - { - "line": 3175, - "column": 65, - "stop_line": 3175, - "stop_column": 69, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser | None` is not assignable to parameter `user` with type `AbstractBaseUser | None` in function `documents.search._backend.TantivyBackend.autocomplete`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser | None` is not assignable to parameter `user` with type `AbstractBaseUser | None` in function `documents.search._backend.TantivyBackend.autocomplete`", - "severity": "error" - }, - { - "line": 3906, - "column": 9, - "stop_line": 3906, - "stop_column": 29, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `TasksViewSet.get_serializer_class` overrides parent class `ReadOnlyModelViewSet` in an inconsistent manner\n `TasksViewSet.get_serializer_class` has type `(self: TasksViewSet) -> type[TaskSerializerV10] | type[TaskSerializerV9]`, which is not assignable to `(self: TasksViewSet) -> type[BaseSerializer[PaperlessTask]]`, the type of `ReadOnlyModelViewSet.get_serializer_class`\n Signature mismatch:\n expected: def get_serializer_class(self: TasksViewSet) -> type[BaseSerializer[PaperlessTask]]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n found: def get_serializer_class(self: TasksViewSet) -> type[TaskSerializerV10] | type[TaskSerializerV9]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type", - "concise_description": "Class member `TasksViewSet.get_serializer_class` overrides parent class `ReadOnlyModelViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 3914, - "column": 12, - "stop_line": 3914, - "stop_column": 38, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `is_staff`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_staff`", - "severity": "error" - }, - { - "line": 3998, - "column": 44, - "stop_line": 3998, - "stop_column": 48, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `QuerySet[PaperlessTask, dict[str, Any]]` is not assignable to parameter `instance` with type `dict[str, Any] | None` in function `rest_framework.serializers.BaseSerializer.__init__`", - "concise_description": "Argument `QuerySet[PaperlessTask, dict[str, Any]]` is not assignable to parameter `instance` with type `dict[str, Any] | None` in function `rest_framework.serializers.BaseSerializer.__init__`", - "severity": "error" - }, - { - "line": 4352, - "column": 24, - "stop_line": 4352, - "stop_column": 51, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BaseSerializer` has no attribute `get_object_class`", - "concise_description": "Object of class `BaseSerializer` has no attribute `get_object_class`", - "severity": "error" - }, - { - "line": 4371, - "column": 17, - "stop_line": 4371, - "stop_column": 21, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User | None` in function `documents.permissions.get_objects_for_user_owner_aware`", - "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User | None` in function `documents.permissions.get_objects_for_user_owner_aware`", - "severity": "error" - }, - { - "line": 4396, - "column": 16, - "stop_line": 4396, - "stop_column": 33, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", - "severity": "error" - }, - { - "line": 4398, - "column": 25, - "stop_line": 4398, - "stop_column": 38, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", - "severity": "error" - }, - { - "line": 4453, - "column": 9, - "stop_line": 4453, - "stop_column": 23, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowTriggerViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner\n `WorkflowTriggerViewSet.partial_update` has type `(self: WorkflowTriggerViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response`, which is not assignable to `(self: WorkflowTriggerViewSet, request: Request, *args: Any, **kwargs: Any) -> Response`, the type of `ModelViewSet.partial_update`\n Signature mismatch:\n ...iggerViewSet, request: Request, *args: Any, **kwargs: Any) -> Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ return type\n |\n parameters\n ...iggerViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", - "concise_description": "Class member `WorkflowTriggerViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 4478, - "column": 9, - "stop_line": 4478, - "stop_column": 23, - "path": "src/documents/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `WorkflowActionViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner\n `WorkflowActionViewSet.partial_update` has type `(self: WorkflowActionViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response`, which is not assignable to `(self: WorkflowActionViewSet, request: Request, *args: Any, **kwargs: Any) -> Response`, the type of `ModelViewSet.partial_update`\n Signature mismatch:\n ...ctionViewSet, request: Request, *args: Any, **kwargs: Any) -> Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ return type\n |\n parameters\n ...ctionViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", - "concise_description": "Class member `WorkflowActionViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 4690, - "column": 36, - "stop_line": 4690, - "stop_column": 52, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `keys`", - "concise_description": "Object of class `NoneType` has no attribute `keys`", - "severity": "error" - }, - { - "line": 4691, - "column": 33, - "stop_line": 4691, - "stop_column": 56, - "path": "src/documents/views.py", - "code": -2, - "name": "unsupported-operation", - "description": "`None` is not subscriptable", - "concise_description": "`None` is not subscriptable", - "severity": "error" - }, - { - "line": 4816, "column": 40, - "stop_line": 4816, - "stop_column": 54, - "path": "src/documents/views.py", - "code": -2, - "name": "unbound-name", - "description": "`all_migrations` may be uninitialized", - "concise_description": "`all_migrations` may be uninitialized", + "path": "src/documents/tests/search/test_cjk_widening.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 4824, - "column": 38, - "stop_line": 4824, - "stop_column": 51, - "path": "src/documents/views.py", - "code": -2, - "name": "unbound-name", - "description": "`celery_active` may be uninitialized", - "concise_description": "`celery_active` may be uninitialized", + "column": 40, + "path": "src/documents/tests/search/test_date_keyword_timezone.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 4893, - "column": 16, - "stop_line": 4893, - "stop_column": 31, - "path": "src/documents/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `app_logo`", - "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "column": 40, + "path": "src/documents/tests/search/test_fuzzy_scoring.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 38, - "column": 22, - "stop_line": 38, - "stop_column": 36, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `title`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", + "column": 40, + "path": "src/documents/tests/search/test_fuzzy_widening.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 39, - "column": 80, - "stop_line": 39, - "stop_column": 91, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `pk`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", - "severity": "error" - }, - { - "line": 40, - "column": 30, - "stop_line": 40, - "stop_column": 57, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `name`", - "concise_description": "Object of class `object` has no attribute `name`", - "severity": "error" - }, - { - "line": 41, - "column": 16, - "stop_line": 41, - "stop_column": 38, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `correspondent`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `correspondent`", - "severity": "error" - }, - { - "line": 43, - "column": 30, - "stop_line": 43, - "stop_column": 57, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `name`", - "concise_description": "Object of class `object` has no attribute `name`", - "severity": "error" - }, - { - "line": 44, - "column": 16, - "stop_line": 44, - "stop_column": 38, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `document_type`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `document_type`", - "severity": "error" - }, - { - "line": 46, - "column": 31, - "stop_line": 46, - "stop_column": 54, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `username`", - "concise_description": "Object of class `object` has no attribute `username`", - "severity": "error" - }, - { - "line": 46, - "column": 58, - "stop_line": 46, - "stop_column": 72, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `owner`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `owner`", - "severity": "error" - }, - { - "line": 47, "column": 25, - "stop_line": 47, - "stop_column": 51, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `original_filename`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `original_filename`", - "severity": "error" - }, - { - "line": 48, - "column": 33, - "stop_line": 48, - "stop_column": 50, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `filename`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `filename`", - "severity": "error" - }, - { - "line": 49, - "column": 41, - "stop_line": 49, - "stop_column": 55, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `added`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `added`", - "severity": "error" - }, - { - "line": 50, - "column": 24, - "stop_line": 50, - "stop_column": 40, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `created`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `created`", - "severity": "error" - }, - { - "line": 51, - "column": 19, - "stop_line": 51, - "stop_column": 30, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ConsumableDocument` has no attribute `pk`", - "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", - "severity": "error" - }, - { - "line": 70, - "column": 42, - "stop_line": 70, - "stop_column": 64, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `original_file`", - "concise_description": "Object of class `Document` has no attribute `original_file`", - "severity": "error" - }, - { - "line": 108, - "column": 13, - "stop_line": 108, - "stop_column": 33, - "path": "src/documents/workflows/actions.py", - "code": -2, + "path": "src/documents/tests/search/test_fuzzy_widening.py", "name": "bad-argument-type", - "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", - "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `object` is not assignable to parameter `node` with type `Node` in function `whoosh_compat.emitters.tantivy_.emit`", "severity": "error" }, { - "line": 120, - "column": 12, - "stop_line": 120, - "stop_column": 32, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `subject`", - "concise_description": "Object of class `NoneType` has no attribute `subject`", - "severity": "error" - }, - { - "line": 125, - "column": 13, - "stop_line": 125, - "stop_column": 30, - "path": "src/documents/workflows/actions.py", - "code": -2, + "column": 32, + "path": "src/documents/tests/search/test_fuzzy_widening.py", "name": "bad-argument-type", - "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", - "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Unpacked keyword argument `object` is not assignable to parameter `index` with type `Index` in function `whoosh_compat.emitters.tantivy_.emit`", + "severity": "error" + }, + { + "column": 32, + "path": "src/documents/tests/search/test_fuzzy_widening.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `object` is not assignable to parameter `registry` with type `FieldRegistry` in function `whoosh_compat.emitters.tantivy_.emit`", + "severity": "error" + }, + { + "column": 32, + "path": "src/documents/tests/search/test_fuzzy_widening.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `object` is not assignable to parameter `rewrite_leaf` with type `((Phrase | Term) -> Node) | None` in function `whoosh_compat.emitters.tantivy_.emit`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/tests/search/test_permission_field_isolation.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | None` is not assignable to parameter `target` with type `Group | User` in function `paperless_testing.permissions.grant_object`", "severity": "error" }, { - "line": 137, "column": 12, - "stop_line": 137, - "stop_column": 29, - "path": "src/documents/workflows/actions.py", - "code": -2, + "path": "src/documents/tests/search/test_query.py", "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `body`", - "concise_description": "Object of class `NoneType` has no attribute `body`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 143, - "column": 12, - "stop_line": 143, - "stop_column": 41, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `include_document`", - "concise_description": "Object of class `NoneType` has no attribute `include_document`", - "severity": "error" - }, - { - "line": 176, - "column": 16, - "stop_line": 176, - "stop_column": 31, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `to`", - "concise_description": "Object of class `NoneType` has no attribute `to`", - "severity": "error" - }, - { - "line": 180, "column": 59, - "stop_line": 180, - "stop_column": 74, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `to`", - "concise_description": "Object of class `NoneType` has no attribute `to`", + "path": "src/documents/tests/search/test_query.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser` is not assignable to parameter `user` with type `AbstractUser` in function `documents.search._backend.build_permission_filter`", "severity": "error" }, { - "line": 199, - "column": 12, - "stop_line": 199, - "stop_column": 37, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `use_params`", - "concise_description": "Object of class `NoneType` has no attribute `use_params`", - "severity": "error" - }, - { - "line": 200, "column": 16, - "stop_line": 200, - "stop_column": 37, - "path": "src/documents/workflows/actions.py", - "code": -2, + "path": "src/documents/tests/search/test_query.py", "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `params`", - "concise_description": "Object of class `NoneType` has no attribute `params`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 202, - "column": 39, - "stop_line": 202, - "stop_column": 66, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `items`", - "concise_description": "Object of class `object` has no attribute `items`", - "severity": "error" - }, - { - "line": 221, - "column": 14, - "stop_line": 221, - "stop_column": 33, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `body`", - "concise_description": "Object of class `NoneType` has no attribute `body`", - "severity": "error" - }, - { - "line": 223, - "column": 17, - "stop_line": 223, - "stop_column": 36, - "path": "src/documents/workflows/actions.py", - "code": -2, + "column": 59, + "path": "src/documents/tests/search/test_query.py", "name": "bad-argument-type", - "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", - "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `AbstractBaseUser` is not assignable to parameter `user` with type `AbstractUser` in function `documents.search._backend.build_permission_filter`", "severity": "error" }, { - "line": 236, - "column": 12, - "stop_line": 236, - "stop_column": 34, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `headers`", - "concise_description": "Object of class `NoneType` has no attribute `headers`", - "severity": "error" - }, - { - "line": 238, - "column": 55, - "stop_line": 238, - "stop_column": 83, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `object` has no attribute `items`", - "concise_description": "Object of class `object` has no attribute `items`", - "severity": "error" - }, - { - "line": 245, - "column": 12, - "stop_line": 245, - "stop_column": 43, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `include_document`", - "concise_description": "Object of class `NoneType` has no attribute `include_document`", - "severity": "error" - }, - { - "line": 258, - "column": 24, - "stop_line": 258, - "stop_column": 42, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 262, - "column": 28, - "stop_line": 262, - "stop_column": 50, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `as_json`", - "concise_description": "Object of class `NoneType` has no attribute `as_json`", - "severity": "error" - }, - { - "line": 266, - "column": 27, - "stop_line": 266, - "stop_column": 45, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 302, - "column": 43, - "stop_line": 302, - "stop_column": 65, - "path": "src/documents/workflows/actions.py", - "code": -2, - "name": "bad-assignment", - "description": "`Unknown | None` is not assignable to `Document`", - "concise_description": "`Unknown | None` is not assignable to `Document`", - "severity": "error" - }, - { - "line": 26, - "column": 8, - "stop_line": 26, - "stop_column": 30, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", - "severity": "error" - }, - { - "line": 64, - "column": 13, - "stop_line": 64, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", - "severity": "error" - }, - { - "line": 65, - "column": 13, - "stop_line": 65, - "stop_column": 42, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", - "severity": "error" - }, - { - "line": 66, - "column": 13, - "stop_line": 66, - "stop_column": 43, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", - "severity": "error" - }, - { - "line": 67, - "column": 13, - "stop_line": 67, - "stop_column": 44, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", - "severity": "error" - }, - { - "line": 86, - "column": 8, - "stop_line": 86, - "stop_column": 39, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", - "severity": "error" - }, - { - "line": 89, - "column": 27, - "stop_line": 89, - "stop_column": 42, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", - "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", - "severity": "error" - }, - { - "line": 92, - "column": 35, - "stop_line": 92, - "stop_column": 73, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", - "concise_description": "Object of class `NoneType` has no attribute `get`", - "severity": "error" - }, - { - "line": 122, - "column": 8, - "stop_line": 122, - "stop_column": 30, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", - "severity": "error" - }, - { - "line": 149, - "column": 13, - "stop_line": 149, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", - "severity": "error" - }, - { - "line": 150, - "column": 13, - "stop_line": 150, - "stop_column": 42, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", - "severity": "error" - }, - { - "line": 151, - "column": 13, - "stop_line": 151, - "stop_column": 43, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", - "severity": "error" - }, - { - "line": 152, - "column": 13, - "stop_line": 152, - "stop_column": 44, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", - "severity": "error" - }, - { - "line": 180, - "column": 8, - "stop_line": 180, - "stop_column": 39, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", - "severity": "error" - }, - { - "line": 185, - "column": 27, - "stop_line": 185, - "stop_column": 65, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", - "concise_description": "Object of class `NoneType` has no attribute `get`", - "severity": "error" - }, - { - "line": 251, - "column": 13, - "stop_line": 251, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", - "severity": "error" - }, - { - "line": 252, - "column": 13, - "stop_line": 252, - "stop_column": 42, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", - "severity": "error" - }, - { - "line": 253, - "column": 13, - "stop_line": 253, - "stop_column": 43, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", - "severity": "error" - }, - { - "line": 254, - "column": 13, - "stop_line": 254, - "stop_column": 44, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", - "severity": "error" - }, - { - "line": 267, - "column": 9, - "stop_line": 267, - "stop_column": 74, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `QuerySet` has no attribute `hard_delete`", - "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", - "severity": "error" - }, - { - "line": 268, - "column": 10, - "stop_line": 268, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", - "severity": "error" - }, - { - "line": 269, - "column": 9, - "stop_line": 272, - "stop_column": 22, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `QuerySet` has no attribute `hard_delete`", - "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", - "severity": "error" - }, - { - "line": 325, - "column": 13, - "stop_line": 325, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", - "severity": "error" - }, - { - "line": 326, - "column": 13, - "stop_line": 326, - "stop_column": 42, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", - "severity": "error" - }, - { - "line": 327, - "column": 13, - "stop_line": 327, - "stop_column": 43, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", - "severity": "error" - }, - { - "line": 328, - "column": 13, - "stop_line": 328, - "stop_column": 44, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", - "severity": "error" - }, - { - "line": 350, - "column": 10, - "stop_line": 350, - "stop_column": 41, - "path": "src/documents/workflows/mutations.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", - "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", - "severity": "error" - }, - { - "line": 23, - "column": 9, - "stop_line": 23, - "stop_column": 27, - "path": "src/paperless/adapter.py", - "code": -2, - "name": "bad-override", - "description": "Class member `CustomAccountAdapter.is_open_for_signup` overrides parent class `DefaultAccountAdapter` in an inconsistent manner\n `CustomAccountAdapter.is_open_for_signup` has type `(self: CustomAccountAdapter, request: Unknown) -> bool | Any`, which is not assignable to `(self: CustomAccountAdapter, request: Unknown) -> Literal[True]`, the type of `DefaultAccountAdapter.is_open_for_signup`\n Signature mismatch:\n expected: def is_open_for_signup(self: CustomAccountAdapter, request: Unknown) -> Literal[True]: ...\n ^^^^^^^^^^^^^ return type\n found: def is_open_for_signup(self: CustomAccountAdapter, request: Unknown) -> bool | Any: ...\n ^^^^^^^^^^ return type", - "concise_description": "Class member `CustomAccountAdapter.is_open_for_signup` overrides parent class `DefaultAccountAdapter` in an inconsistent manner", - "severity": "error" - }, - { - "line": 58, - "column": 26, - "stop_line": 58, - "stop_column": 50, - "path": "src/paperless/adapter.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get_host`", - "concise_description": "Object of class `NoneType` has no attribute `get_host`", - "severity": "error" - }, - { - "line": 63, - "column": 31, - "stop_line": 63, - "stop_column": 55, - "path": "src/paperless/adapter.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get_host`", - "concise_description": "Object of class `NoneType` has no attribute `get_host`", - "severity": "error" - }, - { - "line": 109, - "column": 9, - "stop_line": 109, - "stop_column": 27, - "path": "src/paperless/adapter.py", - "code": -2, - "name": "bad-override", - "description": "Class member `CustomSocialAccountAdapter.is_open_for_signup` overrides parent class `DefaultSocialAccountAdapter` in an inconsistent manner\n `CustomSocialAccountAdapter.is_open_for_signup` has type `(self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> bool | Any`, which is not assignable to `(self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> Literal[True]`, the type of `DefaultSocialAccountAdapter.is_open_for_signup`\n Signature mismatch:\n expected: def is_open_for_signup(self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> Literal[True]: ...\n ^^^^^^^^^^^^^ return type\n found: def is_open_for_signup(self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> bool | Any: ...\n ^^^^^^^^^^ return type", - "concise_description": "Class member `CustomSocialAccountAdapter.is_open_for_signup` overrides parent class `DefaultSocialAccountAdapter` in an inconsistent manner", - "severity": "error" - }, - { - "line": 30, - "column": 24, - "stop_line": 30, - "stop_column": 40, - "path": "src/paperless/admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", - "concise_description": "Object of class `NoneType` has no attribute `get`", - "severity": "error" - }, - { - "line": 33, - "column": 17, - "stop_line": 33, - "stop_column": 29, - "path": "src/paperless/admin.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `PaperlessUserForm` has no attribute `request`", - "concise_description": "Object of class `PaperlessUserForm` has no attribute `request`", - "severity": "error" - }, - { - "line": 48, - "column": 9, - "stop_line": 48, - "stop_column": 21, - "path": "src/paperless/admin.py", - "code": -2, - "name": "bad-argument-count", - "description": "Missing positional argument `value` in function `object.__setattr__`", - "concise_description": "Missing positional argument `value` in function `object.__setattr__`", - "severity": "error" - }, - { - "line": 48, - "column": 9, - "stop_line": 48, - "stop_column": 21, - "path": "src/paperless/admin.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['request']` is not assignable to parameter `self` with type `ModelForm[Unknown]` in function `object.__setattr__`", - "concise_description": "Argument `Literal['request']` is not assignable to parameter `self` with type `ModelForm[Unknown]` in function `object.__setattr__`", - "severity": "error" - }, - { - "line": 65, - "column": 20, - "stop_line": 65, - "stop_column": 46, - "path": "src/paperless/auth.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", - "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", - "severity": "error" - }, - { - "line": 66, "column": 16, - "stop_line": 66, - "stop_column": 41, - "path": "src/paperless/auth.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", - "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "path": "src/documents/tests/search/test_query.py", + "name": "missing-attribute", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 51, - "column": 5, - "stop_line": 51, - "stop_column": 24, - "path": "src/paperless/celery.py", - "code": -2, + "column": 59, + "path": "src/documents/tests/search/test_query.py", "name": "bad-argument-type", - "description": "Argument `(obj: object) -> bytes` is not assignable to parameter `encoder` with type `((Any) -> str) | None` in function `kombu.serialization.register`", - "concise_description": "Argument `(obj: object) -> bytes` is not assignable to parameter `encoder` with type `((Any) -> str) | None` in function `kombu.serialization.register`", + "concise_description": "Argument `AbstractBaseUser` is not assignable to parameter `user` with type `AbstractUser` in function `documents.search._backend.build_permission_filter`", "severity": "error" }, { - "line": 52, - "column": 5, - "stop_line": 52, - "stop_column": 24, - "path": "src/paperless/celery.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `(payload: bytes) -> object` is not assignable to parameter `decoder` with type `((str) -> Any) | None` in function `kombu.serialization.register`", - "concise_description": "Argument `(payload: bytes) -> object` is not assignable to parameter `decoder` with type `((str) -> Any) | None` in function `kombu.serialization.register`", - "severity": "error" - }, - { - "line": 91, - "column": 12, - "stop_line": 91, - "stop_column": 26, - "path": "src/paperless/checks.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "severity": "error" - }, - { - "line": 177, - "column": 9, - "stop_line": 179, - "stop_column": 40, - "path": "src/paperless/checks.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[Error]` is not assignable to declared return type `list[Error | Warning]`", - "concise_description": "Returned type `list[Error]` is not assignable to declared return type `list[Error | Warning]`", - "severity": "error" - }, - { - "line": 196, - "column": 12, - "stop_line": 196, - "stop_column": 18, - "path": "src/paperless/checks.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "severity": "error" - }, - { - "line": 345, - "column": 26, - "stop_line": 348, - "stop_column": 6, - "path": "src/paperless/checks.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], capture_output=Literal[True])\n Possible overloads:\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: Literal[True], timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, *, universal_newlines: Literal[True], startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: Literal[False] | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: None = None, errors: None = None, input: Buffer | None = None, text: Literal[False] | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[bytes] [closest match]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: Buffer | str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[Any]", - "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], capture_output=Literal[True])", - "severity": "error" - }, - { - "line": 367, "column": 16, - "stop_line": 367, - "stop_column": 20, - "path": "src/paperless/checks.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", + "path": "src/documents/tests/search/test_query.py", + "name": "missing-attribute", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 379, - "column": 21, - "stop_line": 383, - "stop_column": 22, - "path": "src/paperless/checks.py", - "code": -2, + "column": 59, + "path": "src/documents/tests/search/test_query.py", "name": "bad-argument-type", - "description": "Argument `Error` is not assignable to parameter `object` with type `Warning` in function `list.append`", - "concise_description": "Argument `Error` is not assignable to parameter `object` with type `Warning` in function `list.append`", + "concise_description": "Argument `AbstractBaseUser` is not assignable to parameter `user` with type `AbstractUser` in function `documents.search._backend.build_permission_filter`", "severity": "error" }, { - "line": 386, - "column": 12, - "stop_line": 386, - "stop_column": 16, - "path": "src/paperless/checks.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", - "severity": "error" - }, - { - "line": 27, "column": 16, - "stop_line": 27, - "stop_column": 26, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `ApplicationConfiguration | None` is not assignable to declared return type `ApplicationConfiguration`", - "concise_description": "Returned type `ApplicationConfiguration | None` is not assignable to declared return type `ApplicationConfiguration`", - "severity": "error" - }, - { - "line": 41, - "column": 28, - "stop_line": 43, - "stop_column": 10, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`OutputTypeChoices | str` is not assignable to attribute `output_type` with type `OutputTypeChoices`", - "concise_description": "`OutputTypeChoices | str` is not assignable to attribute `output_type` with type `OutputTypeChoices`", - "severity": "error" - }, - { - "line": 75, - "column": 21, - "stop_line": 75, - "stop_column": 70, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`ModeChoices | str` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`ModeChoices | str` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 77, - "column": 13, - "stop_line": 78, - "stop_column": 78, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`ArchiveFileGenerationChoices | str` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", - "concise_description": "`ArchiveFileGenerationChoices | str` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", - "severity": "error" - }, - { - "line": 81, - "column": 22, - "stop_line": 81, - "stop_column": 82, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`CleanChoices | str` is not assignable to attribute `clean` with type `CleanChoices`", - "concise_description": "`CleanChoices | str` is not assignable to attribute `clean` with type `CleanChoices`", - "severity": "error" - }, - { - "line": 97, - "column": 13, - "stop_line": 98, - "stop_column": 75, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`ColorConvertChoices | str` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", - "concise_description": "`ColorConvertChoices | str` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", - "severity": "error" - }, - { - "line": 184, - "column": 26, - "stop_line": 184, - "stop_column": 54, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`str | None` is not assignable to attribute `app_title` with type `str`", - "concise_description": "`str | None` is not assignable to attribute `app_title` with type `str`", - "severity": "error" - }, - { - "line": 185, - "column": 25, - "stop_line": 185, - "stop_column": 81, - "path": "src/paperless/config.py", - "code": -2, - "name": "bad-assignment", - "description": "`Unknown | None` is not assignable to attribute `app_logo` with type `str`", - "concise_description": "`Unknown | None` is not assignable to attribute `app_logo` with type `str`", - "severity": "error" - }, - { - "line": 31, - "column": 12, - "stop_line": 31, - "stop_column": 29, - "path": "src/paperless/consumers.py", - "code": -2, + "path": "src/documents/tests/search/test_query.py", "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 34, - "column": 22, - "stop_line": 34, - "stop_column": 33, - "path": "src/paperless/consumers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `groups`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", - "severity": "error" - }, - { - "line": 49, - "column": 35, - "stop_line": 49, - "stop_column": 48, - "path": "src/paperless/consumers.py", - "code": -2, + "column": 59, + "path": "src/documents/tests/search/test_query.py", "name": "bad-argument-type", - "description": "Argument `ProgressUpdateData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`\n Field `owner_id` is `NotRequired` and read-write in `PermissionsData`, so it cannot be required in `ProgressUpdateData`", - "concise_description": "Argument `ProgressUpdateData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`", + "concise_description": "Argument `AbstractBaseUser` is not assignable to parameter `user` with type `AbstractUser` in function `documents.search._backend.build_permission_filter`", "severity": "error" }, { - "line": 61, - "column": 35, - "stop_line": 61, - "stop_column": 48, - "path": "src/paperless/consumers.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `DocumentUpdatedData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`\n Field `owner_id` is `NotRequired` and read-write in `PermissionsData`, so it cannot be required in `DocumentUpdatedData`", - "concise_description": "Argument `DocumentUpdatedData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`", - "severity": "error" - }, - { - "line": 31, - "column": 12, - "stop_line": 31, - "stop_column": 15, - "path": "src/paperless/network.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `list[int | str]` is not assignable to declared return type `list[str]`", - "concise_description": "Returned type `list[int | str]` is not assignable to declared return type `list[str]`", - "severity": "error" - }, - { - "line": 404, - "column": 17, - "stop_line": 404, - "stop_column": 70, - "path": "src/paperless/parsers/tesseract.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `pathlib.Path.write_bytes`\n Protocol `Buffer` requires attribute `__buffer__`", - "concise_description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `pathlib.Path.write_bytes`", - "severity": "error" - }, - { - "line": 61, - "column": 38, - "stop_line": 61, - "stop_column": 56, - "path": "src/paperless/parsers/utils.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `pikepdf._core.Object.get` called with arguments: (Literal['/Marked'], Literal[False])\n Possible overloads:\n (key: Name | int | str, default: T | None = ...) -> Object | T | None [closest match]\n (path: _NamePath, default: T | None = ...) -> Object | T | None", - "concise_description": "No matching overload found for function `pikepdf._core.Object.get` called with arguments: (Literal['/Marked'], Literal[False])", - "severity": "error" - }, - { - "line": 39, "column": 16, - "stop_line": 39, - "stop_column": 29, - "path": "src/paperless/serialisers.py", - "code": -2, + "path": "src/documents/tests/search/test_query.py", "name": "missing-attribute", - "description": "Object of class `PasswordValidationMixin` has no attribute `instance`", - "concise_description": "Object of class `PasswordValidationMixin` has no attribute `instance`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 93, - "column": 17, - "stop_line": 93, - "stop_column": 21, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 153, - "column": 17, - "stop_line": 153, - "stop_column": 22, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[Group]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[Group]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 165, - "column": 17, - "stop_line": 165, - "stop_column": 30, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[SocialAccount]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[SocialAccount]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 199, - "column": 17, - "stop_line": 199, - "stop_column": 21, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[User]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 222, - "column": 9, - "stop_line": 222, - "stop_column": 23, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-override", - "description": "Class member `ApplicationConfigurationSerializer.run_validation` overrides parent class `ModelSerializer` in an inconsistent manner\n `ApplicationConfigurationSerializer.run_validation` has type `(self: ApplicationConfigurationSerializer, data: Unknown) -> Any`, which is not assignable to `(self: ApplicationConfigurationSerializer, data: Any = ...) -> Any`, the type of `ModelSerializer.run_validation`\n Signature mismatch:\n expected: def run_validation(self: ApplicationConfigurationSerializer, data: Any = ...) -> Any: ...\n ^^^^^^^^^ parameters\n found: def run_validation(self: ApplicationConfigurationSerializer, data: Unknown) -> Any: ...\n ^^^^^^^ parameters", - "concise_description": "Class member `ApplicationConfigurationSerializer.run_validation` overrides parent class `ModelSerializer` in an inconsistent manner", - "severity": "error" - }, - { - "line": 251, - "column": 28, - "stop_line": 251, - "stop_column": 43, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `UploadedFile` has no attribute `field_name`", - "concise_description": "Object of class `UploadedFile` has no attribute `field_name`", - "severity": "error" - }, - { - "line": 295, - "column": 17, - "stop_line": 295, - "stop_column": 41, - "path": "src/paperless/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[ApplicationConfiguration]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[ApplicationConfiguration]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 277, - "column": 43, - "stop_line": 282, - "stop_column": 6, - "path": "src/paperless/settings/__init__.py", - "code": -2, - "name": "bad-typed-dict-key", - "description": "`dict[str, int | list[str] | str]` is not assignable to TypedDict key `CONFIG` with type `str`", - "concise_description": "`dict[str, int | list[str] | str]` is not assignable to TypedDict key `CONFIG` with type `str`", - "severity": "error" - }, - { - "line": 448, - "column": 30, - "stop_line": 448, - "stop_column": 52, - "path": "src/paperless/settings/__init__.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.append`", - "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.append`", - "severity": "error" - }, - { - "line": 1012, - "column": 39, - "stop_line": 1012, - "stop_column": 74, - "path": "src/paperless/settings/__init__.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `env_ignore` with type `str` in function `paperless.settings.custom.parse_ignore_dates`", - "concise_description": "Argument `str | None` is not assignable to parameter `env_ignore` with type `str` in function `paperless.settings.custom.parse_ignore_dates`", - "severity": "error" - }, - { - "line": 171, - "column": 27, - "stop_line": 171, - "stop_column": 42, - "path": "src/paperless/settings/custom.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `dict[str, float] | str` is not assignable to parameter `key` with type `str` in function `os.getenv`", - "concise_description": "Argument `dict[str, float] | str` is not assignable to parameter `key` with type `str` in function `os.getenv`", - "severity": "error" - }, - { - "line": 179, - "column": 52, - "stop_line": 179, - "stop_column": 63, - "path": "src/paperless/settings/custom.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `dict` has no attribute `split`", - "concise_description": "Object of class `dict` has no attribute `split`", - "severity": "error" - }, - { - "line": 185, - "column": 19, - "stop_line": 185, - "stop_column": 34, - "path": "src/paperless/settings/custom.py", - "code": -2, - "name": "invalid-argument", - "description": "Expected a mapping, got dict[str, float] | str", - "concise_description": "Expected a mapping, got dict[str, float] | str", - "severity": "error" - }, - { - "line": 771, - "column": 12, - "stop_line": 771, - "stop_column": 24, - "path": "src/paperless/tests/parsers/conftest.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `(**django_settings_overrides: Unknown) -> _GeneratorContextManager[RasterisedDocumentParser]` is not assignable to declared return type `(...) -> Generator[RasterisedDocumentParser]`\n Protocol `Generator` requires attribute `__next__`", - "concise_description": "Returned type `(**django_settings_overrides: Unknown) -> _GeneratorContextManager[RasterisedDocumentParser]` is not assignable to declared return type `(...) -> Generator[RasterisedDocumentParser]`", - "severity": "error" - }, - { - "line": 168, - "column": 45, - "stop_line": 168, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_mail_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['na']` is not assignable to parameter `document_path` with type `Path` in function `paperless.parsers.mail.MailDocumentParser.extract_metadata`", - "concise_description": "Argument `Literal['na']` is not assignable to parameter `document_path` with type `Path` in function `paperless.parsers.mail.MailDocumentParser.extract_metadata`", - "severity": "error" - }, - { - "line": 372, "column": 47, - "stop_line": 372, - "stop_column": 75, - "path": "src/paperless/tests/parsers/test_mail_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 727, - "column": 20, - "stop_line": 727, - "stop_column": 31, - "path": "src/paperless/tests/parsers/test_mail_parser.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `url`", - "concise_description": "Object of class `NoneType` has no attribute `url`", - "severity": "error" - }, - { - "line": 25, - "column": 23, - "stop_line": 36, - "stop_column": 10, - "path": "src/paperless/tests/parsers/test_mail_parser_live.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], check=Literal[True])\n Possible overloads:\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: Literal[True], timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, *, universal_newlines: Literal[True], startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: Literal[False] | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: None = None, errors: None = None, input: Buffer | None = None, text: Literal[False] | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[bytes] [closest match]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> object) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: Buffer | str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[Any]", - "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], check=Literal[True])", - "severity": "error" - }, - { - "line": 264, - "column": 37, - "stop_line": 264, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_mail_parser_live.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `pdf_path` with type `Path` in function `extract_text`", - "concise_description": "Argument `Path | None` is not assignable to parameter `pdf_path` with type `Path` in function `extract_text`", - "severity": "error" - }, - { - "line": 401, - "column": 42, - "stop_line": 401, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_parse_modes.py", - "code": -2, - "name": "bad-assignment", - "description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 77, - "column": 34, - "stop_line": 77, - "stop_column": 36, - "path": "src/paperless/tests/parsers/test_remote_parser.py", - "code": -2, - "name": "bad-argument-count", - "description": "Expected 1 more positional argument", - "concise_description": "Expected 1 more positional argument", - "severity": "error" - }, - { - "line": 28, - "column": 24, - "stop_line": 28, - "stop_column": 35, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 29, - "column": 25, - "stop_line": 29, - "stop_column": 37, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 30, - "column": 26, - "stop_line": 30, - "stop_column": 39, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 111, - "column": 28, - "stop_line": 111, - "stop_column": 39, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 112, - "column": 29, - "stop_line": 112, - "stop_column": 41, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 113, - "column": 30, - "stop_line": 113, - "stop_column": 43, - "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "concise_description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", - "severity": "error" - }, - { - "line": 279, - "column": 38, - "stop_line": 279, - "stop_column": 75, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.get_dpi`", - "concise_description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.get_dpi`", - "severity": "error" - }, - { - "line": 290, - "column": 17, - "stop_line": 290, - "stop_column": 65, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.calculate_a4_dpi`", - "concise_description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.calculate_a4_dpi`", - "severity": "error" - }, - { - "line": 410, - "column": 13, - "stop_line": 410, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 427, - "column": 13, - "stop_line": 427, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 442, - "column": 13, - "stop_line": 442, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 455, - "column": 13, - "stop_line": 455, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 507, - "column": 13, - "stop_line": 507, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 523, - "column": 13, - "stop_line": 523, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 593, - "column": 42, - "stop_line": 593, - "stop_column": 46, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-assignment", - "description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", - "concise_description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", - "severity": "error" - }, - { - "line": 1053, - "column": 13, - "stop_line": 1053, - "stop_column": 40, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "concise_description": "Argument `str | None` is not assignable to parameter `content` with type `str` in function `assert_ordered_substrings`", - "severity": "error" - }, - { - "line": 1122, - "column": 14, - "stop_line": 1122, - "stop_column": 37, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1122, - "column": 14, - "stop_line": 1122, - "stop_column": 37, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1149, - "column": 14, - "stop_line": 1149, - "stop_column": 56, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1149, - "column": 14, - "stop_line": 1149, - "stop_column": 56, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1158, - "column": 14, - "stop_line": 1158, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1158, - "column": 14, - "stop_line": 1158, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1167, - "column": 14, - "stop_line": 1167, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1167, - "column": 14, - "stop_line": 1167, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1188, - "column": 14, - "stop_line": 1188, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1188, - "column": 14, - "stop_line": 1188, - "stop_column": 77, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1196, - "column": 14, - "stop_line": 1196, - "stop_column": 69, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1196, - "column": 14, - "stop_line": 1196, - "stop_column": 69, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1205, - "column": 14, - "stop_line": 1205, - "stop_column": 70, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__enter__`\n Did you mean `__iter__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 1205, - "column": 14, - "stop_line": 1205, - "stop_column": 70, - "path": "src/paperless/tests/parsers/test_tesseract_parser.py", - "code": -2, - "name": "bad-context-manager", - "description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager\n Object of class `Generator` has no attribute `__exit__`\n Did you mean `__next__`?", - "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", - "severity": "error" - }, - { - "line": 115, - "column": 19, - "stop_line": 115, - "stop_column": 49, - "path": "src/paperless/tests/parsers/test_tika_parser.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`\n Protocol `PathLike` requires attribute `__fspath__`", - "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", - "severity": "error" - }, - { - "line": 25, - "column": 16, - "stop_line": 25, - "stop_column": 30, - "path": "src/paperless/tests/test_celery.py", - "code": -2, + "path": "src/documents/tests/search/test_schema.py", "name": "bad-index", - "description": "Cannot index into `object`\n Object of class `object` has no attribute `__getitem__`", - "concise_description": "Cannot index into `object`", - "severity": "error" - }, - { - "line": 26, - "column": 16, - "stop_line": 26, - "stop_column": 30, - "path": "src/paperless/tests/test_celery.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `object`\n Object of class `object` has no attribute `__getitem__`", - "concise_description": "Cannot index into `object`", - "severity": "error" - }, - { - "line": 296, - "column": 16, - "stop_line": 296, - "stop_column": 39, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `str` and `None`", - "concise_description": "`in` is not supported between `str` and `None`", - "severity": "error" - }, - { - "line": 297, - "column": 16, - "stop_line": 297, - "stop_column": 45, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `str` and `None`", - "concise_description": "`in` is not supported between `str` and `None`", - "severity": "error" - }, - { - "line": 315, - "column": 29, - "stop_line": 315, - "stop_column": 53, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `str.join` called with arguments: (Generator[str | None])\n Possible overloads:\n (iterable: Iterable[LiteralString], /) -> LiteralString [closest match]\n (iterable: Iterable[str], /) -> str", - "concise_description": "No matching overload found for function `str.join` called with arguments: (Generator[str | None])", - "severity": "error" - }, - { - "line": 345, - "column": 16, - "stop_line": 345, - "stop_column": 56, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `Literal['PAPERLESS_DB_TIMEOUT']` and `None`", - "concise_description": "`in` is not supported between `Literal['PAPERLESS_DB_TIMEOUT']` and `None`", - "severity": "error" - }, - { - "line": 348, - "column": 20, - "stop_line": 348, - "stop_column": 50, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`not in` is not supported between `str` and `None`", - "concise_description": "`not in` is not supported between `str` and `None`", - "severity": "error" - }, - { - "line": 376, - "column": 16, - "stop_line": 376, - "stop_column": 56, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `Literal['PAPERLESS_DB_OPTIONS']` and `None`", - "concise_description": "`in` is not supported between `Literal['PAPERLESS_DB_OPTIONS']` and `None`", - "severity": "error" - }, - { - "line": 599, - "column": 16, - "stop_line": 599, - "stop_column": 44, - "path": "src/paperless/tests/test_checks.py", - "code": -2, - "name": "not-iterable", - "description": "`in` is not supported between `Literal['v2.20.10']` and `None`", - "concise_description": "`in` is not supported between `Literal['v2.20.10']` and `None`", - "severity": "error" - }, - { - "line": 328, - "column": 35, - "stop_line": 328, - "stop_column": 49, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.LowScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.LowScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 329, - "column": 35, - "stop_line": 329, - "stop_column": 50, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.HighScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.HighScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 355, - "column": 35, - "stop_line": 355, - "stop_column": 50, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_parser_returning_none_score_is_skipped.DecliningParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_parser_returning_none_score_is_skipped.DecliningParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 381, - "column": 35, - "stop_line": 381, - "stop_column": 49, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 382, - "column": 35, - "stop_line": 382, - "stop_column": 49, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", - "severity": "error" - }, - { - "line": 423, - "column": 35, - "stop_line": 423, - "stop_column": 48, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.BuiltinParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.BuiltinParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 424, - "column": 35, - "stop_line": 424, - "stop_column": 49, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.ExternalParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.ExternalParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", - "severity": "error" - }, - { - "line": 465, - "column": 35, - "stop_line": 465, - "stop_column": 51, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.AcceptingBuiltin]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.AcceptingBuiltin]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", - "severity": "error" - }, - { - "line": 466, - "column": 35, - "stop_line": 466, - "stop_column": 52, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.DecliningExternal]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.DecliningExternal]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", - "severity": "error" - }, - { - "line": 694, - "column": 35, - "stop_line": 694, - "stop_column": 44, - "path": "src/paperless/tests/test_registry.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestLogSummary.test_log_summary_with_external_parsers.ExtParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`\n Protocol `ParserProtocol` requires attribute `can_produce_archive`", - "concise_description": "Argument `type[TestLogSummary.test_log_summary_with_external_parsers.ExtParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", - "severity": "error" - }, - { - "line": 294, - "column": 23, - "stop_line": 294, - "stop_column": 47, - "path": "src/paperless/tests/test_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", - "concise_description": "Object of class `NoneType` has no attribute `get`", - "severity": "error" - }, - { - "line": 301, - "column": 23, - "stop_line": 301, - "stop_column": 47, - "path": "src/paperless/tests/test_signals.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `get`", - "concise_description": "Object of class `NoneType` has no attribute `get`", - "severity": "error" - }, - { - "line": 21, - "column": 21, - "stop_line": 21, - "stop_column": 47, - "path": "src/paperless/tests/test_views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `streaming_content`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `streaming_content`", - "severity": "error" - }, - { - "line": 407, - "column": 9, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless/urls.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `django.urls.conf.path` called with arguments: (Literal['ws/status/'], _ASGIApplicationProtocol)\n Possible overloads:\n (route: _StrOrPromise, view: (...) -> HttpResponseBase, kwargs: dict[str, Any] | None = None, name: str | None = None) -> URLPattern [closest match]\n (route: _StrOrPromise, view: (...) -> Coroutine[Any, Any, HttpResponseBase], kwargs: dict[str, Any] | None = None, name: str | None = None) -> URLPattern\n (route: _StrOrPromise, view: tuple[Sequence[URLPattern | URLResolver], str | None, str | None], kwargs: dict[str, Any] | None = None, name: str | None = None) -> URLResolver\n (route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] | None = None, name: str | None = None) -> URLResolver", - "concise_description": "No matching overload found for function `django.urls.conf.path` called with arguments: (Literal['ws/status/'], _ASGIApplicationProtocol)", - "severity": "error" - }, - { - "line": 199, - "column": 20, - "stop_line": 199, - "stop_column": 60, - "path": "src/paperless/validators.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `EllipsisType` has no attribute `lower`", - "concise_description": "Object of class `EllipsisType` has no attribute `lower`", - "severity": "error" - }, - { - "line": 199, - "column": 32, - "stop_line": 199, - "stop_column": 43, - "path": "src/paperless/validators.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Ellipsis | Unknown` is not assignable to parameter `text_or_uri_element` with type `_Element | bytes | str | None` in function `lxml.etree.QName.__init__`", - "concise_description": "Argument `Ellipsis | Unknown` is not assignable to parameter `text_or_uri_element` with type `_Element | bytes | str | None` in function `lxml.etree.QName.__init__`", - "severity": "error" - }, - { - "line": 205, - "column": 38, - "stop_line": 205, - "stop_column": 58, - "path": "src/paperless/validators.py", - "code": -2, - "name": "no-matching-overload", - "description": "No matching overload found for function `str.join` called with arguments: (Iterator[_AnyStr] | Unknown)\n Possible overloads:\n (iterable: Iterable[LiteralString], /) -> LiteralString [closest match]\n (iterable: Iterable[str], /) -> str", - "concise_description": "No matching overload found for function `str.join` called with arguments: (Iterator[_AnyStr] | Unknown)", - "severity": "error" - }, - { - "line": 214, - "column": 38, - "stop_line": 214, - "stop_column": 58, - "path": "src/paperless/validators.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `EllipsisType` has no attribute `items`", - "concise_description": "Object of class `EllipsisType` has no attribute `items`", - "severity": "error" - }, - { - "line": 77, - "column": 23, - "stop_line": 77, - "stop_column": 42, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `paginator`", - "concise_description": "Object of class `NoneType` has no attribute `paginator`", - "severity": "error" - }, - { - "line": 92, - "column": 17, - "stop_line": 92, - "stop_column": 36, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `paginator`", - "concise_description": "Object of class `NoneType` has no attribute `paginator`", - "severity": "error" - }, - { - "line": 95, - "column": 16, - "stop_line": 95, - "stop_column": 35, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `paginator`", - "concise_description": "Object of class `NoneType` has no attribute `paginator`", - "severity": "error" - }, - { - "line": 144, - "column": 9, - "stop_line": 144, - "stop_column": 15, - "path": "src/paperless/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `UserViewSet.create` overrides parent class `ModelViewSet` in an inconsistent manner\n `UserViewSet.create` has type `(self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response`, which is not assignable to `(self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response`, the type of `ModelViewSet.create`\n Signature mismatch:\n expected: def create(self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ return type\n |\n parameters\n found: def create(self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", - "concise_description": "Class member `UserViewSet.create` overrides parent class `ModelViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 163, - "column": 9, - "stop_line": 163, - "stop_column": 15, - "path": "src/paperless/views.py", - "code": -2, - "name": "bad-override", - "description": "Class member `UserViewSet.update` overrides parent class `ModelViewSet` in an inconsistent manner\n `UserViewSet.update` has type `(self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response`, which is not assignable to `(self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response`, the type of `ModelViewSet.update`\n Signature mismatch:\n expected: def update(self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ return type\n |\n parameters\n found: def update(self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ return type\n |\n parameters", - "concise_description": "Class member `UserViewSet.update` overrides parent class `ModelViewSet` in an inconsistent manner", - "severity": "error" - }, - { - "line": 255, - "column": 13, - "stop_line": 255, - "stop_column": 30, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `set_password`", - "concise_description": "Object of class `NoneType` has no attribute `set_password`", - "severity": "error" - }, - { - "line": 256, - "column": 13, - "stop_line": 256, - "stop_column": 22, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 260, - "column": 9, - "stop_line": 260, - "stop_column": 18, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `save`", - "concise_description": "Object of class `NoneType` has no attribute `save`", - "severity": "error" - }, - { - "line": 337, - "column": 38, - "stop_line": 337, - "stop_column": 75, - "path": "src/paperless/views.py", - "code": -2, - "name": "bad-assignment", - "description": "`Authenticator | None` is not assignable to `Authenticator`", - "concise_description": "`Authenticator | None` is not assignable to `Authenticator`", - "severity": "error" - }, - { - "line": 339, - "column": 34, - "stop_line": 339, - "stop_column": 65, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `TOTP` has no attribute `get_unused_codes`\nObject of class `WebAuthn` has no attribute `get_unused_codes`", - "concise_description": "Object of class `TOTP` has no attribute `get_unused_codes`\nObject of class `WebAuthn` has no attribute `get_unused_codes`", - "severity": "error" - }, - { - "line": 417, - "column": 13, - "stop_line": 417, - "stop_column": 36, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `ai_enabled`", - "concise_description": "Object of class `NoneType` has no attribute `ai_enabled`", - "severity": "error" - }, - { - "line": 417, - "column": 41, - "stop_line": 417, - "stop_column": 75, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `NoneType` has no attribute `llm_embedding_backend`", - "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_backend`", - "severity": "error" - }, - { - "line": 465, - "column": 23, - "stop_line": 465, - "stop_column": 45, - "path": "src/paperless/views.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `AbstractBaseUser` has no attribute `socialaccount_set`\nObject of class `AnonymousUser` has no attribute `socialaccount_set`", - "concise_description": "Object of class `AbstractBaseUser` has no attribute `socialaccount_set`\nObject of class `AnonymousUser` has no attribute `socialaccount_set`", - "severity": "error" - }, - { - "line": 102, - "column": 30, - "stop_line": 102, - "stop_column": 36, - "path": "src/paperless_ai/ai_classifier.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", - "concise_description": "Argument `str` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", - "severity": "error" - }, - { - "line": 102, - "column": 18, - "stop_line": 102, - "stop_column": 46, - "path": "src/paperless_ai/chat.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Response` has no attribute `response_gen`", - "concise_description": "Object of class `Response` has no attribute `response_gen`", - "severity": "error" - }, - { - "line": 79, - "column": 16, - "stop_line": 79, - "stop_column": 35, - "path": "src/paperless_ai/client.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `dict[str, Any]` is not assignable to declared return type `str`", - "concise_description": "Returned type `dict[str, Any]` is not assignable to declared return type `str`", - "severity": "error" - }, - { - "line": 97, - "column": 21, - "stop_line": 97, - "stop_column": 38, - "path": "src/paperless_ai/embedding.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Document` has no attribute `custom_fields`", - "concise_description": "Object of class `Document` has no attribute `custom_fields`", - "severity": "error" - }, - { - "line": 261, - "column": 46, - "stop_line": 261, - "stop_column": 51, - "path": "src/paperless_ai/indexing.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", - "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", - "severity": "error" - }, - { - "line": 274, - "column": 46, - "stop_line": 274, - "stop_column": 51, - "path": "src/paperless_ai/indexing.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", - "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", - "severity": "error" - }, - { - "line": 331, - "column": 15, - "stop_line": 331, - "stop_column": 20, - "path": "src/paperless_ai/indexing.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `llama_index.core.indices.vector_store.retrievers.retriever.VectorIndexRetriever.__init__`", - "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `llama_index.core.indices.vector_store.retrievers.retriever.VectorIndexRetriever.__init__`", - "severity": "error" - }, - { - "line": 41, - "column": 9, - "stop_line": 41, - "stop_column": 30, - "path": "src/paperless_ai/tests/test_ai_indexing.py", - "code": -2, - "name": "bad-override", - "description": "Class member `FakeEmbedding._aget_query_embedding` overrides parent class `BaseEmbedding` in an inconsistent manner\n `FakeEmbedding._aget_query_embedding` has type `(self: FakeEmbedding, query: str) -> list[float]`, which is not assignable to `(self: FakeEmbedding, query: str) -> Coroutine[Unknown, Unknown, list[float]]`, the type of `BaseEmbedding._aget_query_embedding`\n Signature mismatch:\n expected: def _aget_query_embedding(self: FakeEmbedding, query: str) -> Coroutine[Unknown, Unknown, list[float]]: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return type\n found: def _aget_query_embedding(self: FakeEmbedding, query: str) -> list[float]: ...\n ^^^^^^^^^^ return type", - "concise_description": "Class member `FakeEmbedding._aget_query_embedding` overrides parent class `BaseEmbedding` in an inconsistent manner", - "severity": "error" - }, - { - "line": 107, - "column": 12, - "stop_line": 107, - "stop_column": 27, - "path": "src/paperless_ai/tests/test_client.py", - "code": -2, - "name": "bad-index", - "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['title'])\n Possible overloads:\n (key: SupportsIndex | slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | Unknown | None], /) -> LiteralString\n (key: SupportsIndex | slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | Unknown | None], /) -> str [closest match]", "concise_description": "Cannot index into `str`", "severity": "error" }, { - "line": 38, - "column": 49, - "stop_line": 38, - "stop_column": 53, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "column": 40, + "path": "src/documents/tests/search/test_schema_fingerprint.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `SettingsWrapper` from `pytest_django.fixtures`", "severity": "error" }, { - "line": 46, - "column": 59, - "stop_line": 46, - "stop_column": 63, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_correspondents_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_correspondents_by_name`", - "severity": "error" - }, - { - "line": 54, - "column": 59, - "stop_line": 54, - "stop_column": 63, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_document_types_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_document_types_by_name`", - "severity": "error" - }, - { - "line": 62, - "column": 58, - "stop_line": 62, - "stop_column": 62, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_storage_paths_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_storage_paths_by_name`", - "severity": "error" - }, - { - "line": 76, - "column": 37, - "stop_line": 76, - "stop_column": 42, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[str | None]` is not assignable to parameter `names` with type `list[str]` in function `paperless_ai.matching.match_tags_by_name`", - "concise_description": "Argument `list[str | None]` is not assignable to parameter `names` with type `list[str]` in function `paperless_ai.matching.match_tags_by_name`", - "severity": "error" - }, - { - "line": 76, - "column": 49, - "stop_line": 76, - "stop_column": 53, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", - "severity": "error" - }, - { - "line": 83, - "column": 49, - "stop_line": 83, - "stop_column": 53, - "path": "src/paperless_ai/tests/test_matching.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", - "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", - "severity": "error" - }, - { - "line": 168, - "column": 26, - "stop_line": 168, - "stop_column": 30, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-assignment", - "description": "`None` is not assignable to attribute `color` with type `str`", - "concise_description": "`None` is not assignable to attribute `color` with type `str`", - "severity": "error" - }, - { - "line": 185, - "column": 64, - "stop_line": 185, - "stop_column": 76, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `str` in function `imaplib.IMAP4.uid`", - "concise_description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `str` in function `imaplib.IMAP4.uid`", - "severity": "error" - }, - { - "line": 197, - "column": 33, - "stop_line": 197, - "stop_column": 70, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[str] | list[Unknown] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Argument `list[str] | list[Unknown] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`", - "severity": "error" - }, - { - "line": 275, - "column": 53, - "stop_line": 275, - "stop_column": 74, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `BaseMailAction.post_consume`", - "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `BaseMailAction.post_consume`", - "severity": "error" - }, - { - "line": 376, - "column": 13, - "stop_line": 376, - "stop_column": 34, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `TagMailAction.__init__`", - "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `TagMailAction.__init__`", - "severity": "error" - }, - { - "line": 393, - "column": 30, - "stop_line": 393, - "stop_column": 46, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "unsupported-operation", - "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", - "concise_description": "Cannot set item in `dict[str, date]`", - "severity": "error" - }, - { - "line": 395, - "column": 27, - "stop_line": 395, - "stop_column": 41, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "unsupported-operation", - "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", - "concise_description": "Cannot set item in `dict[str, date]`", - "severity": "error" - }, - { - "line": 397, - "column": 32, - "stop_line": 397, - "stop_column": 51, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "unsupported-operation", - "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", - "concise_description": "Cannot set item in `dict[str, date]`", - "severity": "error" - }, - { - "line": 399, - "column": 29, - "stop_line": 399, - "stop_column": 45, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "unsupported-operation", - "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", - "concise_description": "Cannot set item in `dict[str, date]`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 407, - "column": 38, - "stop_line": 407, - "stop_column": 49, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`\n Protocol `Iterable` requires attribute `__iter__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 411, - "column": 32, - "stop_line": 411, - "stop_column": 43, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", - "severity": "error" - }, - { - "line": 437, "column": 12, - "stop_line": 437, - "stop_column": 19, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "bad-return", - "description": "Returned type `MailBox | MailBoxStartTls | MailBoxUnencrypted` is not assignable to declared return type `MailBox`", - "concise_description": "Returned type `MailBox | MailBoxStartTls | MailBoxUnencrypted` is not assignable to declared return type `MailBox`", + "path": "src/documents/tests/search/test_schema_fingerprint.py", + "name": "bad-index", + "concise_description": "Cannot index into `str`", "severity": "error" }, { - "line": 577, - "column": 54, - "stop_line": 577, - "stop_column": 67, - "path": "src/paperless_mail/mail.py", - "code": -2, + "column": 16, + "path": "src/documents/tests/search/test_schema_fingerprint.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `typing.MutableMapping.update` called with arguments: (dict[str, object])", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/search/test_tokenizer.py", "name": "missing-attribute", - "description": "Object of class `MailAccount` has no attribute `rules`", - "concise_description": "Object of class `MailAccount` has no attribute `rules`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 580, - "column": 29, - "stop_line": 580, - "stop_column": 42, - "path": "src/paperless_mail/mail.py", - "code": -2, + "column": 16, + "path": "src/documents/tests/search/test_tokenizer.py", "name": "missing-attribute", - "description": "Object of class `MailAccount` has no attribute `rules`", - "concise_description": "Object of class `MailAccount` has no attribute `rules`", + "concise_description": "Object of class `SearchResult` has no attribute `count`", "severity": "error" }, { - "line": 626, - "column": 31, - "stop_line": 626, - "stop_column": 52, - "path": "src/paperless_mail/mail.py", - "code": -2, + "column": 16, + "path": "src/documents/tests/search/test_tokenizer.py", + "name": "missing-attribute", + "concise_description": "Object of class `SearchResult` has no attribute `count`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/search/test_tokenizer.py", + "name": "missing-attribute", + "concise_description": "Object of class `SearchResult` has no attribute `count`", + "severity": "error" + }, + { + "column": 38, + "path": "src/documents/tests/search/test_widen_leaf.py", "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.insert`", - "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.insert`", + "concise_description": "Argument `Node | None` is not assignable to parameter `child` with type `Node` in function `whoosh_compat.ast.Boosted.__init__`", "severity": "error" }, { - "line": 633, - "column": 44, - "stop_line": 633, - "stop_column": 50, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "unbound-name", - "description": "`folder` is uninitialized", - "concise_description": "`folder` is uninitialized", - "severity": "error" - }, - { - "line": 966, - "column": 40, - "stop_line": 966, - "stop_column": 60, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", - "concise_description": "Object of class `Message` has no attribute `_headers`", - "severity": "error" - }, - { - "line": 970, - "column": 32, - "stop_line": 970, - "stop_column": 52, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", - "concise_description": "Object of class `Message` has no attribute `_headers`", - "severity": "error" - }, - { - "line": 971, - "column": 32, - "stop_line": 971, - "stop_column": 52, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", - "concise_description": "Object of class `Message` has no attribute `_headers`", - "severity": "error" - }, - { - "line": 972, - "column": 17, - "stop_line": 972, - "stop_column": 37, - "path": "src/paperless_mail/mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", - "concise_description": "Object of class `Message` has no attribute `_headers`", - "severity": "error" - }, - { - "line": 986, - "column": 27, - "stop_line": 986, - "stop_column": 40, - "path": "src/paperless_mail/mail.py", - "code": -2, + "column": 22, + "path": "src/documents/tests/search/test_widen_leaf.py", "name": "bad-argument-type", - "description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", - "concise_description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "concise_description": "Argument `tuple[Term, Node | None]` is not assignable to parameter `children` with type `tuple[Node, ...]` in function `whoosh_compat.ast.Or.__init__`", "severity": "error" }, { - "line": 97, - "column": 39, - "stop_line": 97, - "stop_column": 60, - "path": "src/paperless_mail/oauth.py", - "code": -2, + "column": 51, + "path": "src/documents/tests/search/test_widen_leaf.py", "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", - "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "concise_description": "Argument `tuple[Term, Node | None]` is not assignable to parameter `children` with type `tuple[Node, ...]` in function `whoosh_compat.ast.Or.__init__`", "severity": "error" }, { - "line": 103, - "column": 39, - "stop_line": 103, - "stop_column": 60, - "path": "src/paperless_mail/oauth.py", - "code": -2, + "column": 22, + "path": "src/documents/tests/search/test_widen_leaf.py", "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", - "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "concise_description": "Argument `tuple[Term, Node | None]` is not assignable to parameter `children` with type `tuple[Node, ...]` in function `whoosh_compat.ast.Or.__init__`", "severity": "error" }, { - "line": 106, - "column": 35, - "stop_line": 106, - "stop_column": 41, - "path": "src/paperless_mail/oauth.py", - "code": -2, - "name": "unbound-name", - "description": "`result` may be uninitialized", - "concise_description": "`result` may be uninitialized", + "column": 26, + "path": "src/documents/tests/test_admin.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", "severity": "error" }, { - "line": 73, - "column": 71, - "stop_line": 73, - "stop_column": 99, - "path": "src/paperless_mail/preprocessor.py", - "code": -2, + "column": 16, + "path": "src/documents/tests/test_admin.py", "name": "missing-attribute", - "description": "Object of class `Crypt` has no attribute `stderr`", - "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "concise_description": "Object of class `ModelForm` has no attribute `request`", "severity": "error" }, { - "line": 31, - "column": 17, - "stop_line": 31, - "stop_column": 28, - "path": "src/paperless_mail/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[MailAccount]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[MailAccount]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 78, - "column": 17, - "stop_line": 78, - "stop_column": 25, - "path": "src/paperless_mail/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[MailRule]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[MailRule]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 154, - "column": 17, - "stop_line": 154, - "stop_column": 30, - "path": "src/paperless_mail/serialisers.py", - "code": -2, - "name": "bad-assignment", - "description": "`type[ProcessedMail]` is not assignable to attribute `model` with type `type[_MT]`", - "concise_description": "`type[ProcessedMail]` is not assignable to attribute `model` with type `type[_MT]`", - "severity": "error" - }, - { - "line": 23, - "column": 11, - "stop_line": 23, - "stop_column": 18, - "path": "src/paperless_mail/tests/conftest.py", - "code": -2, - "name": "invalid-yield", - "description": "Yielded type `MailAccountFactory` is not assignable to declared yield type `MailAccount`", - "concise_description": "Yielded type `MailAccountFactory` is not assignable to declared yield type `MailAccount`", - "severity": "error" - }, - { - "line": 24, - "column": 5, - "stop_line": 24, - "stop_column": 19, - "path": "src/paperless_mail/tests/conftest.py", - "code": -2, + "column": 9, + "path": "src/documents/tests/test_admin.py", "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `delete`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `delete`", + "concise_description": "Object of class `ModelForm` has no attribute `request`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_admin.py", + "name": "missing-attribute", + "concise_description": "Object of class `ModelForm` has no attribute `request`", + "severity": "error" + }, + { + "column": 30, + "path": "src/documents/tests/test_api_app_config.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 124, "column": 31, - "stop_line": 124, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, + "path": "src/documents/tests/test_api_app_config.py", "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 144, - "column": 31, - "stop_line": 144, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 153, - "column": 56, - "stop_line": 153, - "stop_column": 67, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 158, - "column": 31, - "stop_line": 158, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 167, - "column": 56, - "stop_line": 167, - "stop_column": 67, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 243, - "column": 27, - "stop_line": 243, - "stop_column": 37, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 290, - "column": 52, - "stop_line": 290, - "stop_column": 60, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "severity": "error" - }, - { - "line": 340, - "column": 53, - "stop_line": 340, - "stop_column": 64, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 342, - "column": 57, - "stop_line": 342, - "stop_column": 74, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `filter_from`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_from`", - "severity": "error" - }, - { - "line": 343, - "column": 55, - "stop_line": 343, - "stop_column": 70, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `filter_to`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_to`", - "severity": "error" - }, - { - "line": 344, - "column": 60, - "stop_line": 344, - "stop_column": 80, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `filter_subject`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_subject`", - "severity": "error" - }, - { - "line": 345, - "column": 57, - "stop_line": 345, - "stop_column": 74, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `filter_body`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_body`", - "severity": "error" - }, - { - "line": 348, - "column": 13, - "stop_line": 348, - "stop_column": 53, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `filter_attachment_filename_include`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `filter_attachment_filename_include`", - "severity": "error" - }, - { - "line": 377, - "column": 24, - "stop_line": 377, - "stop_column": 35, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 391, - "column": 29, - "stop_line": 391, - "stop_column": 35, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `TagFactory` has no attribute `pk`", - "concise_description": "Object of class `TagFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 392, - "column": 37, - "stop_line": 392, - "stop_column": 53, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CorrespondentFactory` has no attribute `pk`", - "concise_description": "Object of class `CorrespondentFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 393, - "column": 37, - "stop_line": 393, - "stop_column": 53, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `DocumentTypeFactory` has no attribute `pk`", - "concise_description": "Object of class `DocumentTypeFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 411, - "column": 53, - "stop_line": 411, - "stop_column": 64, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 462, - "column": 31, - "stop_line": 462, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 483, - "column": 31, - "stop_line": 483, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 492, "column": 50, - "stop_line": 492, - "stop_column": 58, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 504, - "column": 28, - "stop_line": 504, - "stop_column": 46, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 524, - "column": 54, - "stop_line": 524, - "stop_column": 69, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, + "path": "src/documents/tests/test_api_app_config.py", "name": "bad-argument-type", - "description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 530, - "column": 28, - "stop_line": 530, - "stop_column": 46, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 552, - "column": 31, - "stop_line": 552, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 553, - "column": 30, - "stop_line": 553, - "stop_column": 48, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 557, - "column": 9, - "stop_line": 557, - "stop_column": 30, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `refresh_from_db`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `refresh_from_db`", - "severity": "error" - }, - { - "line": 576, - "column": 49, - "stop_line": 576, - "stop_column": 54, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `MailRuleFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `MailRuleFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "severity": "error" - }, - { - "line": 599, - "column": 24, - "stop_line": 599, - "stop_column": 34, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 651, - "column": 54, - "stop_line": 651, - "stop_column": 57, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "severity": "error" - }, - { - "line": 658, - "column": 44, - "stop_line": 658, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 658, - "column": 52, - "stop_line": 658, - "stop_column": 58, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 658, - "column": 60, - "stop_line": 658, - "stop_column": 66, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 676, - "column": 60, - "stop_line": 676, - "stop_column": 68, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", - "severity": "error" - }, - { - "line": 680, - "column": 44, - "stop_line": 680, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 680, - "column": 52, - "stop_line": 680, - "stop_column": 58, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 702, - "column": 56, - "stop_line": 702, - "stop_column": 66, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "concise_description": "Argument `ProcessedMailFactory` is not assignable to parameter `obj` with type `Model | None` in function `guardian.shortcuts.assign_perm`", - "severity": "error" - }, - { - "line": 709, - "column": 30, - "stop_line": 709, - "stop_column": 43, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 709, - "column": 45, - "stop_line": 709, - "stop_column": 56, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 709, - "column": 58, - "stop_line": 709, - "stop_column": 71, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 717, - "column": 14, - "stop_line": 717, - "stop_column": 27, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 717, - "column": 29, - "stop_line": 717, - "stop_column": 40, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 717, - "column": 42, - "stop_line": 717, - "stop_column": 55, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 719, - "column": 58, - "stop_line": 719, - "stop_column": 71, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 720, - "column": 58, - "stop_line": 720, - "stop_column": 69, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 721, - "column": 58, - "stop_line": 721, - "stop_column": 71, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 722, - "column": 57, - "stop_line": 722, - "stop_column": 72, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 728, - "column": 30, - "stop_line": 728, - "stop_column": 45, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 733, - "column": 57, - "stop_line": 733, - "stop_column": 72, - "path": "src/paperless_mail/tests/test_api.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `ProcessedMailFactory` has no attribute `id`\n Did you mean `uid`?", - "concise_description": "Object of class `ProcessedMailFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 60, - "column": 44, - "stop_line": 60, - "stop_column": 48, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `None` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "concise_description": "Argument `None` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "severity": "error" - }, - { - "line": 79, - "column": 37, - "stop_line": 79, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "severity": "error" - }, - { - "line": 122, - "column": 37, - "stop_line": 122, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "severity": "error" - }, - { - "line": 127, - "column": 37, - "stop_line": 127, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "severity": "error" - }, - { - "line": 131, - "column": 37, - "stop_line": 131, - "stop_column": 42, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", - "severity": "error" - }, - { - "line": 177, "column": 25, - "stop_line": 177, - "stop_column": 40, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "path": "src/documents/tests/test_api_app_config.py", "name": "missing-attribute", - "description": "Object of class `MailMessage` has no attribute `flagged`", - "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 179, "column": 25, - "stop_line": 179, - "stop_column": 37, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "path": "src/documents/tests/test_api_app_config.py", "name": "missing-attribute", - "description": "Object of class `MailMessage` has no attribute `seen`", - "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "concise_description": "Object of class `NoneType` has no attribute `path`", "severity": "error" }, { - "line": 265, - "column": 9, - "stop_line": 265, - "stop_column": 22, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 27, + "path": "src/documents/tests/test_api_app_config.py", "name": "missing-attribute", - "description": "Object of class `MailMessage` has no attribute `seen`", - "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "concise_description": "Object of class `ImageFile` has no attribute `text`", "severity": "error" }, { - "line": 266, - "column": 9, - "stop_line": 266, - "stop_column": 25, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailMessage` has no attribute `flagged`", - "concise_description": "Object of class `MailMessage` has no attribute `flagged`", - "severity": "error" - }, - { - "line": 439, - "column": 50, - "stop_line": 439, - "stop_column": 64, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Class `message2` has no class attribute `from_`", - "concise_description": "Class `message2` has no class attribute `from_`", - "severity": "error" - }, - { - "line": 448, - "column": 54, - "stop_line": 448, - "stop_column": 61, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 454, - "column": 40, - "stop_line": 454, - "stop_column": 47, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 459, - "column": 40, - "stop_line": 459, - "stop_column": 48, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 462, - "column": 32, - "stop_line": 462, - "stop_column": 47, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CorrespondentFactory` has no attribute `id`", - "concise_description": "Object of class `CorrespondentFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 468, - "column": 40, - "stop_line": 468, - "stop_column": 47, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 471, - "column": 40, - "stop_line": 471, - "stop_column": 48, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 473, - "column": 32, - "stop_line": 473, - "stop_column": 47, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `CorrespondentFactory` has no attribute `id`", - "concise_description": "Object of class `CorrespondentFactory` has no attribute `id`", - "severity": "error" - }, - { - "line": 480, - "column": 40, - "stop_line": 480, - "stop_column": 47, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", - "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 495, - "column": 45, - "stop_line": 495, - "stop_column": 52, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 495, - "column": 54, - "stop_line": 495, - "stop_column": 57, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 65, + "path": "src/documents/tests/test_api_bulk_download.py", "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", "severity": "error" }, { - "line": 500, - "column": 45, - "stop_line": 500, - "stop_column": 52, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "severity": "error" - }, - { - "line": 500, - "column": 54, - "stop_line": 500, - "stop_column": 57, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "severity": "error" - }, - { - "line": 505, - "column": 45, - "stop_line": 505, - "stop_column": 52, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "severity": "error" - }, - { - "line": 505, - "column": 54, - "stop_line": 505, - "stop_column": 57, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", - "severity": "error" - }, - { - "line": 1250, - "column": 9, - "stop_line": 1250, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BogusFolderManager` has no attribute `list`", - "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", - "severity": "error" - }, - { - "line": 1256, - "column": 9, - "stop_line": 1256, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BogusFolderManager` has no attribute `list`", - "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", - "severity": "error" - }, - { - "line": 1283, - "column": 9, - "stop_line": 1283, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BogusFolderManager` has no attribute `list`", - "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", - "severity": "error" - }, - { - "line": 1289, - "column": 9, - "stop_line": 1289, - "stop_column": 50, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `BogusFolderManager` has no attribute `list`", - "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", - "severity": "error" - }, - { - "line": 1351, - "column": 13, - "stop_line": 1355, - "stop_column": 14, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[list[dict[str, int]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", - "concise_description": "Argument `list[list[dict[str, int]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", - "severity": "error" - }, - { - "line": 1370, - "column": 13, - "stop_line": 1374, - "stop_column": 14, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `list[list[dict[str, None]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", - "concise_description": "Argument `list[list[dict[str, None]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", - "severity": "error" - }, - { - "line": 1603, "column": 21, - "stop_line": 1603, - "stop_column": 33, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "path": "src/documents/tests/test_api_chat.py", "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", "severity": "error" }, { - "line": 1614, + "column": 50, + "path": "src/documents/tests/test_api_document_versions.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_document_versions.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_document_versions.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_document_versions.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_document_versions.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `bytes` is not assignable to parameter `data` with type `str` in function `rest_framework.test.APIClient.generic`", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[int] | None` is not assignable to parameter `first` with type `Iterable[Any]` in function `unittest.case.TestCase.assertCountEqual`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_api_documents.py", + "name": "not-iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/tests/test_api_documents.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `ui_settings`", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/tests/test_api_documents.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `ui_settings`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_api_documents.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `value`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_api_documents.py", + "name": "bad-unpacking", + "concise_description": "Expected argument after ** to have `str` keys, got: dict[str, list[dict[str, str]]] | list[bool] | list[date] | list[float] | list[int] | list[str] | list[Unknown] | str in function `django.db.models.manager.Manager.create`", + "severity": "error" + }, + { + "column": 29, + "path": "src/documents/tests/test_api_filter_by_custom_fields.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `urllib.parse.quote` called with arguments: (str | None, safe=Literal[''])", + "severity": "error" + }, + { + "column": 65, + "path": "src/documents/tests/test_api_objects.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 34, + "path": "src/documents/tests/test_api_objects.py", + "name": "missing-attribute", + "concise_description": "Object of type `Group | dict[Unknown, Unknown]` has no attribute `count`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_api_permissions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `owner`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_api_permissions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `owner`", + "severity": "error" + }, + { + "column": 55, + "path": "src/documents/tests/test_api_permissions.py", + "name": "bad-argument-type", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", + "severity": "error" + }, + { + "column": 53, + "path": "src/documents/tests/test_api_permissions.py", + "name": "bad-argument-type", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_api_permissions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `owner`", + "severity": "error" + }, + { + "column": 53, + "path": "src/documents/tests/test_api_permissions.py", + "name": "bad-argument-type", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "severity": "error" + }, + { + "column": 49, + "path": "src/documents/tests/test_api_post_document_nfc.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `unistr` with type `str` in function `unicodedata.is_normalized`", + "severity": "error" + }, + { + "column": 49, + "path": "src/documents/tests/test_api_post_document_nfc.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `unistr` with type `str` in function `unicodedata.is_normalized`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `name`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `provider_id`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "column": 41, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `key`", + "severity": "error" + }, + { + "column": 29, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_api_profile.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 34, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 20, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 51, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_api_schema.py", + "name": "bad-index", + "concise_description": "Cannot index into `SchemaGenerator`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_api_uisettings.py", + "name": "missing-attribute", + "concise_description": "Object of class `User` has no attribute `ui_settings`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_api_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `pk`", + "severity": "error" + }, + { "column": 13, - "stop_line": 1614, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "path": "src/documents/tests/test_api_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `ai_suggestion_fields`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/tests/test_api_workflows.py", "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `action_parameter`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `action_parameter`", + "concise_description": "Object of class `NoneType` has no attribute `ai_create_missing`", "severity": "error" }, { - "line": 1641, "column": 25, - "stop_line": 1641, - "stop_column": 37, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "path": "src/documents/tests/test_api_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `ai_overwrite_existing`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_barcodes.py", "name": "missing-attribute", - "description": "Object of class `MailRuleFactory` has no attribute `pk`", - "concise_description": "Object of class `MailRuleFactory` has no attribute `pk`", + "concise_description": "Object of class `GetReaderPluginMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "column": 5, + "path": "src/documents/tests/test_barcodes.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestAsnBarcode, filepath: Path) -> BarcodePlugin)", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/tests/test_barcodes.py", + "name": "bad-return", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "column": 5, + "path": "src/documents/tests/test_barcodes.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `contextlib.contextmanager` called with arguments: ((self: Self@TestTagBarcode, filepath: Path) -> BarcodePlugin)", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/tests/test_barcodes.py", + "name": "bad-return", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "severity": "error" + }, + { + "column": 81, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "severity": "error" + }, + { + "column": 81, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", "severity": "error" }, { - "line": 1652, - "column": 41, - "stop_line": 1652, - "stop_column": 61, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, + "column": 13, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "severity": "error" + }, + { + "column": 48, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "missing-attribute", + "concise_description": "Object of type `Group | dict[Unknown, Unknown]` has no attribute `count`", + "severity": "error" + }, + { + "column": 48, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "missing-attribute", + "concise_description": "Object of type `Group | dict[Unknown, Unknown]` has no attribute `count`", + "severity": "error" + }, + { + "column": 65, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 34, + "path": "src/documents/tests/test_bulk_edit.py", + "name": "missing-attribute", + "concise_description": "Object of type `Group | dict[Unknown, Unknown]` has no attribute `count`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `classes_`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `classes_`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `transform`", + "severity": "error" + }, + { + "column": 40, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-module-attribute", + "concise_description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `append`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_classifier.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `classes_`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-return", + "concise_description": "Returned type `Path | None` is not assignable to declared return type `Path`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `current_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `current_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `max_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `max_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `status`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `status`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `current_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `current_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `max_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `max_progress`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentUpdatedData` does not have key `status`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_consumer.py", + "name": "bad-typed-dict-key", + "concise_description": "TypedDict `DocumentsDeletedData` does not have key `status`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `filename`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `filename`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `filename`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_consumer.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `archive_filename`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_document_list_effective_content_annotation.py", + "name": "bad-assignment", + "concise_description": "`SimpleNamespace` is not assignable to attribute `request` with type `Request`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_document_list_effective_content_annotation.py", + "name": "bad-assignment", + "concise_description": "`SimpleNamespace` is not assignable to attribute `request` with type `Request`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_document_list_effective_content_annotation.py", + "name": "missing-attribute", + "concise_description": "Object of class `Document` has no attribute `effective_content`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_document_list_effective_content_annotation.py", + "name": "missing-attribute", + "concise_description": "Object of class `Document` has no attribute `_prefetched_objects_cache`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/tests/test_file_handling.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `PathLike[str] | str` in function `paperless_testing.assertions.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/tests/test_filters.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal[1698330605] | dict[Any, Any] | list[object] | None` is not assignable to parameter `value` with type `date | datetime | str` in function `documents.templating.filters.localize_date`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/tests/test_management_exporter.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/tests/test_management_exporter.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_management_exporter.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/tests/test_management_exporter.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_management_exporter.py", + "name": "missing-attribute", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_management_importer.py", + "name": "missing-attribute", + "concise_description": "Object of class `Model` has no attribute `name`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_management_importer.py", + "name": "missing-attribute", + "concise_description": "Object of class `Model` has no attribute `correspondent_id`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_management_importer.py", + "name": "missing-attribute", + "concise_description": "Object of class `Model` has no attribute `correspondent_id`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_migration_sha256_checksums.py", + "name": "missing-attribute", + "concise_description": "Object of class `TestMigrations` has no attribute `_fixture_teardown`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_models.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `correspondent`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_models.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `correspondent`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_parsers.py", + "name": "not-callable", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_parsers.py", + "name": "not-callable", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_parsers.py", + "name": "not-callable", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "column": 36, + "path": "src/documents/tests/test_permission_filtering_security.py", + "name": "bad-argument-type", + "concise_description": "Argument `AnonymousUser` is not assignable to parameter `user` with type `User | None` in function `documents.permissions.permitted_document_ids`", + "severity": "error" + }, + { + "column": 46, + "path": "src/documents/tests/test_permission_filtering_security.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "severity": "error" + }, + { + "column": 56, + "path": "src/documents/tests/test_permission_filtering_security.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "severity": "error" + }, + { + "column": 56, + "path": "src/documents/tests/test_permission_filtering_security.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "severity": "error" + }, + { + "column": 55, + "path": "src/documents/tests/test_permission_filtering_security.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_sanity_check.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_sanity_check.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/tests/test_sanity_check.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "column": 28, + "path": "src/documents/tests/test_share_link_bundles.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_tag_hierarchy.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_tag_hierarchy.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_task_signals.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_task_signals.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_task_signals.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `Literal['traceback']` and `None`", + "severity": "error" + }, + { + "column": 20, + "path": "src/documents/tests/test_task_signals.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_views.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_views.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_views.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/tests/test_views.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `save`", + "severity": "error" + }, + { + "column": 26, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_views.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedWSGIResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "severity": "error" + }, + { + "column": 50, + "path": "src/documents/tests/test_views.py", + "name": "bad-argument-type", + "concise_description": "Argument `_MonkeyPatchedWSGIResponse` is not assignable to parameter `response` with type `StreamingHttpResponse` in function `paperless_testing.http.read_streaming_response`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `suggestions`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `suggestions`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `suggestions`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `str` has no attribute `name`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 40, + "path": "src/documents/tests/test_workflows.py", "name": "bad-argument-type", - "description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`\n Protocol `Container` requires attribute `__contains__`", "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", "severity": "error" }, { - "line": 2045, + "column": 35, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "column": 39, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "column": 43, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 38, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 38, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 38, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { + "column": 21, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Group | dict[Unknown, Unknown]` is not assignable to parameter `iterable` with type `Iterable[@_]` in function `list.__init__`", + "severity": "error" + }, + { "column": 24, - "stop_line": 2045, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 2068, "column": 24, - "stop_line": 2068, - "stop_column": 39, - "path": "src/paperless_mail/tests/test_mail.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `MailAccountFactory` has no attribute `pk`", - "concise_description": "Object of class `MailAccountFactory` has no attribute `pk`", + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-count", + "concise_description": "Missing positional argument `value` in function `list.count`", "severity": "error" }, { - "line": 135, "column": 42, - "stop_line": 135, - "stop_column": 54, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "path": "src/documents/tests/test_workflows.py", + "name": "bad-assignment", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Any, Any]`", "severity": "error" }, { - "line": 146, - "column": 42, - "stop_line": 146, - "stop_column": 54, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "severity": "error" - }, - { - "line": 178, - "column": 46, - "stop_line": 178, - "stop_column": 58, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "severity": "error" - }, - { - "line": 188, - "column": 46, - "stop_line": 188, - "stop_column": 58, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", - "severity": "error" - }, - { - "line": 308, - "column": 55, - "stop_line": 308, - "stop_column": 67, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "severity": "error" - }, - { - "line": 326, - "column": 55, - "stop_line": 326, - "stop_column": 75, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "severity": "error" - }, - { - "line": 366, - "column": 63, - "stop_line": 366, - "stop_column": 75, - "path": "src/paperless_mail/tests/test_mail_oauth.py", - "code": -2, - "name": "bad-argument-type", - "description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "concise_description": "Argument `MailAccountFactory` is not assignable to parameter `account` with type `MailAccount` in function `paperless_mail.mail.MailAccountHandler.handle_mail_account`", - "severity": "error" - }, - { - "line": 70, - "column": 9, - "stop_line": 70, - "stop_column": 30, - "path": "src/paperless_mail/tests/test_preprocessor.py", - "code": -2, - "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", - "concise_description": "Object of class `Message` has no attribute `_headers`", - "severity": "error" - }, - { - "line": 72, "column": 27, - "stop_line": 72, - "stop_column": 48, - "path": "src/paperless_mail/tests/test_preprocessor.py", - "code": -2, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 23, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `files` with type `dict[Unknown, Unknown]` in function `celery.app.task.Task.__call__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 35, + "path": "src/documents/tests/test_workflows.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "column": 35, + "path": "src/documents/tests/test_workflows.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/utils.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `setUp`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/tests/utils.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `tearDown`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/utils.py", + "name": "missing-attribute", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/utils.py", + "name": "missing-attribute", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/tests/utils.py", + "name": "missing-attribute", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "column": 34, + "path": "src/documents/utils.py", + "name": "bad-assignment", + "concise_description": "`float | int | None` is not assignable to attribute `MAX_IMAGE_PIXELS` with type `int | None`", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `username`", + "severity": "error" + }, + { + "column": 32, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of type `AbstractBaseUser | AnonymousUser` has no attribute `get_full_name`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `get_serializer_context`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `filter_queryset`", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `get_queryset`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "severity": "error" + }, + { + "column": 29, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `Self@CorrespondentViewSet` is not assignable to parameter `instance` with type `Options[Any] | None` in function `django.db.models.manager.BaseManager.__get__`", + "severity": "error" + }, + { + "column": 29, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `annotate`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `Self@CorrespondentViewSet` is not assignable to parameter `instance` with type `Options[Any] | None` in function `django.db.models.manager.BaseManager.__get__`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `annotate`", + "severity": "error" + }, + { + "column": 48, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `Correspondent` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 48, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `DocumentType` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 48, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `StoragePath` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 28, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Class `DocumentFilterSet` has no class attribute `declared_filters`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/views.py", + "name": "bad-override", + "concise_description": "Class member `DocumentViewSet.destroy` overrides parent class `DestroyModelMixin` in an inconsistent manner", + "severity": "error" + }, + { + "column": 37, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[MetadataEntry] | list[Unknown] | None` is not assignable to parameter `original_metadata` with type `list[Unknown]` in function `documents.caching.set_metadata_cache`", + "severity": "error" + }, + { + "column": 57, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "severity": "error" + }, + { + "column": 59, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "severity": "error" + }, + { + "column": 58, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `ClassificationSuggestions` is not assignable to parameter `suggestions` with type `dict[Unknown, Unknown]` in function `documents.caching.set_llm_suggestions_cache`", + "severity": "error" + }, + { + "column": 5, + "path": "src/documents/views.py", + "name": "bad-specialization", + "concise_description": "`(self: Self@DocumentViewSet, request: Unknown, pk: Unknown | None = None) -> HttpResponseForbidden | Response | None` is not assignable to upper bound `(...) -> HttpResponseBase` of type variable `_View`", + "severity": "error" + }, + { + "column": 36, + "path": "src/documents/views.py", + "name": "missing-argument", + "concise_description": "Missing argument `request` in function `DocumentViewSet.email_documents`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/views.py", + "name": "bad-override", + "concise_description": "Class member `UnifiedSearchViewSet.list` overrides parent class `DocumentViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of type `BasePagination | None` has no attribute `get_page_size`", + "severity": "error" + }, + { + "column": 58, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of type `BasePagination | None` has no attribute `page_size`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/views.py", + "name": "not-iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "column": 43, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `TantivyRelevanceList` is not assignable to parameter `queryset` with type `QuerySet[Any, @_] | Sequence[@_]` in function `rest_framework.generics.GenericAPIView.paginate_queryset`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/views.py", + "name": "unsupported-operation", + "concise_description": "`+` is not supported between `None` and `Literal[1]`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "not-iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentSelectionMixin._resolve_document_ids`", + "severity": "error" + }, + { + "column": 18, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User` in function `DocumentOperationPermissionMixin._has_document_permissions`", + "severity": "error" + }, + { + "column": 33, + "path": "src/documents/views.py", + "name": "unbound-name", + "concise_description": "`old_values` may be uninitialized", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `Correspondent` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `Tag` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `DocumentType` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `StoragePath` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 52, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `CustomField` has no attribute `document_count`", + "severity": "error" + }, + { + "column": 65, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser | None` is not assignable to parameter `user` with type `AbstractUser | None` in function `documents.search._backend.TantivyBackend.autocomplete`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/views.py", + "name": "bad-override", + "concise_description": "Class member `TasksViewSet.get_serializer_class` overrides parent class `ReadOnlyModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_staff`", + "severity": "error" + }, + { + "column": 44, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `QuerySet[PaperlessTask, dict[str, Any]]` is not assignable to parameter `instance` with type `dict[str, Any] | None` in function `rest_framework.serializers.BaseSerializer.__init__`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `Sequence` has no attribute `append`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `BaseSerializer` has no attribute `get_object_class`", + "severity": "error" + }, + { + "column": 45, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User | None` in function `documents.permissions.permitted_object_ids`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/views.py", + "name": "bad-override", + "concise_description": "Class member `WorkflowTriggerViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/views.py", + "name": "bad-override", + "concise_description": "Class member `WorkflowActionViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 40, + "path": "src/documents/views.py", + "name": "unbound-name", + "concise_description": "`all_migrations` may be uninitialized", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `User | None` in function `documents.permissions.permitted_document_ids`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `app_logo`", + "severity": "error" + }, + { + "column": 22, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", + "severity": "error" + }, + { + "column": 80, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", + "severity": "error" + }, + { + "column": 30, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `name`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `correspondent`", + "severity": "error" + }, + { + "column": 30, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `name`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `document_type`", + "severity": "error" + }, + { + "column": 31, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `username`", + "severity": "error" + }, + { + "column": 58, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `owner`", + "severity": "error" + }, + { + "column": 25, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `original_filename`", + "severity": "error" + }, + { + "column": 33, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `filename`", + "severity": "error" + }, + { + "column": 41, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `added`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `created`", + "severity": "error" + }, + { + "column": 19, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", + "severity": "error" + }, + { + "column": 42, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `Document` has no attribute `original_file`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/workflows/actions.py", + "name": "bad-argument-type", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `subject`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/workflows/actions.py", + "name": "bad-argument-type", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `body`", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `include_document`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `to`", + "severity": "error" + }, + { + "column": 59, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `to`", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `use_params`", + "severity": "error" + }, + { + "column": 16, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `params`", + "severity": "error" + }, + { + "column": 39, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `items`", + "severity": "error" + }, + { + "column": 14, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `body`", + "severity": "error" + }, + { + "column": 17, + "path": "src/documents/workflows/actions.py", + "name": "bad-argument-type", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `headers`", + "severity": "error" + }, + { + "column": 55, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `object` has no attribute `items`", + "severity": "error" + }, + { + "column": 12, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `include_document`", + "severity": "error" + }, + { + "column": 24, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "column": 28, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `as_json`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/workflows/actions.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "column": 43, + "path": "src/documents/workflows/actions.py", + "name": "bad-assignment", + "concise_description": "`Unknown | None` is not assignable to `Document`", + "severity": "error" + }, + { + "column": 8, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "severity": "error" + }, + { + "column": 8, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/workflows/mutations.py", + "name": "bad-argument-type", + "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "severity": "error" + }, + { + "column": 35, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "column": 8, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "severity": "error" + }, + { + "column": 8, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "severity": "error" + }, + { + "column": 27, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "column": 10, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "severity": "error" + }, + { + "column": 9, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "severity": "error" + }, + { + "column": 13, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "severity": "error" + }, + { + "column": 10, + "path": "src/documents/workflows/mutations.py", + "name": "missing-attribute", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless/adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get_host`", + "severity": "error" + }, + { + "column": 31, + "path": "src/paperless/adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get_host`", + "severity": "error" + }, + { + "column": 22, + "path": "src/paperless/adapter.py", + "name": "bad-assignment", + "concise_description": "`AbstractBaseUser` is not assignable to `User`", + "severity": "error" + }, + { + "column": 22, + "path": "src/paperless/adapter.py", + "name": "bad-assignment", + "concise_description": "`AbstractBaseUser` is not assignable to `User`", + "severity": "error" + }, + { + "column": 24, + "path": "src/paperless/admin.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "column": 17, + "path": "src/paperless/admin.py", + "name": "missing-attribute", + "concise_description": "Object of class `PaperlessUserForm` has no attribute `request`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/auth.py", + "name": "bad-return", + "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/auth.py", + "name": "bad-return", + "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "severity": "error" + }, + { + "column": 5, + "path": "src/paperless/celery.py", + "name": "bad-argument-type", + "concise_description": "Argument `(obj: object) -> bytes` is not assignable to parameter `encoder` with type `((Any) -> str) | None` in function `kombu.serialization.register`", + "severity": "error" + }, + { + "column": 5, + "path": "src/paperless/celery.py", + "name": "bad-argument-type", + "concise_description": "Argument `(payload: bytes) -> Any` is not assignable to parameter `decoder` with type `((str) -> Any) | None` in function `kombu.serialization.register`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/checks.py", + "name": "bad-return", + "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/checks.py", + "name": "bad-return", + "concise_description": "Returned type `list[Error]` is not assignable to declared return type `list[Error | Warning]`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/checks.py", + "name": "bad-return", + "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless/checks.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], capture_output=Literal[True])", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/checks.py", + "name": "bad-return", + "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", + "severity": "error" + }, + { + "column": 21, + "path": "src/paperless/checks.py", + "name": "bad-argument-type", + "concise_description": "Argument `Error` is not assignable to parameter `object` with type `Warning` in function `list.append`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/checks.py", + "name": "bad-return", + "concise_description": "Returned type `list[Warning]` is not assignable to declared return type `list[Error]`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/config.py", + "name": "bad-return", + "concise_description": "Returned type `ApplicationConfiguration | None` is not assignable to declared return type `ApplicationConfiguration`", + "severity": "error" + }, + { + "column": 28, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`OutputTypeChoices | str` is not assignable to attribute `output_type` with type `OutputTypeChoices`", + "severity": "error" + }, + { + "column": 21, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`ModeChoices | str` is not assignable to attribute `mode` with type `ModeChoices`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`ArchiveFileGenerationChoices | str` is not assignable to attribute `archive_file_generation` with type `ArchiveFileGenerationChoices`", + "severity": "error" + }, + { + "column": 22, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`CleanChoices | str` is not assignable to attribute `clean` with type `CleanChoices`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`ColorConvertChoices | str` is not assignable to attribute `color_conversion_strategy` with type `ColorConvertChoices`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`str | None` is not assignable to attribute `app_title` with type `str`", + "severity": "error" + }, + { + "column": 25, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`Unknown | None` is not assignable to attribute `app_logo` with type `str`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless/config.py", + "name": "bad-assignment", + "concise_description": "`RemoteOCRMode | str` is not assignable to attribute `remote_ocr_mode` with type `RemoteOCRMode`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/consumers.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "column": 22, + "path": "src/paperless/consumers.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/consumers.py", + "name": "bad-argument-type", + "concise_description": "Argument `ProgressUpdateData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/consumers.py", + "name": "bad-argument-type", + "concise_description": "Argument `DocumentUpdatedData` is not assignable to parameter `data` with type `PermissionsData` in function `StatusConsumer._can_view`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/network.py", + "name": "bad-return", + "concise_description": "Returned type `list[int | str]` is not assignable to declared return type `list[str]`", + "severity": "error" + }, + { + "column": 17, + "path": "src/paperless/parsers/tesseract.py", + "name": "bad-argument-type", + "concise_description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `pathlib.Path.write_bytes`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/serialisers.py", + "name": "missing-attribute", + "concise_description": "Object of class `PasswordValidationMixin` has no attribute `instance`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/serialisers.py", + "name": "bad-override", + "concise_description": "Class member `ApplicationConfigurationSerializer.run_validation` overrides parent class `ModelSerializer` in an inconsistent manner", + "severity": "error" + }, + { + "column": 28, + "path": "src/paperless/serialisers.py", + "name": "missing-attribute", + "concise_description": "Object of class `UploadedFile` has no attribute `field_name`", + "severity": "error" + }, + { + "column": 43, + "path": "src/paperless/settings/__init__.py", + "name": "bad-assignment", + "concise_description": "`dict[str, int | list[str] | str]` is not assignable to dict key `CONFIG` with type `str`", + "severity": "error" + }, + { + "column": 30, + "path": "src/paperless/settings/__init__.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.append`", + "severity": "error" + }, + { + "column": 39, + "path": "src/paperless/settings/__init__.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `env_ignore` with type `str` in function `paperless.settings.custom.parse_ignore_dates`", + "severity": "error" + }, + { + "column": 27, + "path": "src/paperless/settings/custom.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | dict[str, float]` is not assignable to parameter `key` with type `str` in function `os.getenv`", + "severity": "error" + }, + { + "column": 52, + "path": "src/paperless/settings/custom.py", + "name": "missing-attribute", + "concise_description": "Object of class `dict` has no attribute `split`", + "severity": "error" + }, + { + "column": 19, + "path": "src/paperless/settings/custom.py", + "name": "invalid-argument", + "concise_description": "Expected a mapping, got str | dict[str, float]", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless/tests/parsers/conftest.py", + "name": "bad-return", + "concise_description": "Returned type `(**django_settings_overrides: Unknown) -> _GeneratorContextManager[RasterisedDocumentParser]` is not assignable to declared return type `(...) -> Generator[RasterisedDocumentParser]`", + "severity": "error" + }, + { + "column": 45, + "path": "src/paperless/tests/parsers/test_mail_parser.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['na']` is not assignable to parameter `document_path` with type `Path` in function `paperless.parsers.mail.MailDocumentParser.extract_metadata`", + "severity": "error" + }, + { + "column": 47, + "path": "src/paperless/tests/parsers/test_mail_parser.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/tests/parsers/test_mail_parser.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `url`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/tests/parsers/test_mail_parser_live.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], check=Literal[True])", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless/tests/parsers/test_mail_parser_live.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `pdf_path` with type `Path` in function `extract_text`", + "severity": "error" + }, + { + "column": 42, + "path": "src/paperless/tests/parsers/test_parse_modes.py", + "name": "bad-assignment", + "concise_description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", + "severity": "error" + }, + { + "column": 34, + "path": "src/paperless/tests/parsers/test_remote_parser.py", + "name": "bad-argument-count", + "concise_description": "Expected 1 more positional argument", + "severity": "error" + }, + { + "column": 24, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 25, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 28, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['input.pdf']` is not assignable to parameter `input_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 29, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['output.pdf']` is not assignable to parameter `output_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 30, + "path": "src/paperless/tests/parsers/test_tesseract_custom_settings.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['sidecar.txt']` is not assignable to parameter `sidecar_file` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.construct_ocrmypdf_parameters`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-argument-type", + "concise_description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.get_dpi`", + "severity": "error" + }, + { + "column": 17, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-argument-type", + "concise_description": "Argument `str` is not assignable to parameter `image` with type `Path` in function `paperless.parsers.tesseract.RasterisedDocumentParser.calculate_a4_dpi`", + "severity": "error" + }, + { + "column": 42, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-assignment", + "concise_description": "`str` is not assignable to attribute `mode` with type `ModeChoices`", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 14, + "path": "src/paperless/tests/parsers/test_tesseract_parser.py", + "name": "bad-context-manager", + "concise_description": "Cannot use `Generator[RasterisedDocumentParser]` as a context manager", + "severity": "error" + }, + { + "column": 19, + "path": "src/paperless/tests/parsers/test_tika_parser.py", + "name": "bad-argument-type", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "column": 43, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.account.adapter.DefaultAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 43, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.account.adapter.DefaultAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 47, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.account.adapter.DefaultAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "column": 43, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 49, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `sociallogin` with type `SocialLogin` in function `allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 47, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 53, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `sociallogin` with type `SocialLogin` in function `allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup`", + "severity": "error" + }, + { + "column": 49, + "path": "src/paperless/tests/test_adapter.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `request` with type `HttpRequest` in function `allauth.socialaccount.adapter.DefaultSocialAccountAdapter.get_connect_redirect_url`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/tests/test_adapter.py", + "name": "missing-attribute", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `groups`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/tests/test_api_auth.py", + "name": "missing-attribute", + "concise_description": "Object of class `FunctionType` has no attribute `view_class`", + "severity": "error" + }, + { + "column": 50, + "path": "src/paperless/tests/test_api_auth.py", + "name": "missing-attribute", + "concise_description": "Object of class `FunctionType` has no attribute `view_class`", + "severity": "error" + }, + { + "column": 47, + "path": "src/paperless/tests/test_auth_middleware.py", + "name": "bad-argument-type", + "concise_description": "Argument `(request: HttpRequest) -> None` is not assignable to parameter `get_response` with type `_AnyGetResponseCallable` in function `django.utils.deprecation.MiddlewareMixin.__init__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `str` and `None`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `str` and `None`", + "severity": "error" + }, + { + "column": 29, + "path": "src/paperless/tests/test_checks.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `str.join` called with arguments: (Generator[str | None])", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `Literal['PAPERLESS_DB_TIMEOUT']` and `None`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`not in` is not supported between `str` and `None`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `Literal['PAPERLESS_DB_OPTIONS']` and `None`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/tests/test_checks.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `Literal['v2.20.15']` and `None`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.LowScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_highest_score_wins.HighScoreParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_parser_returning_none_score_is_skipped.DecliningParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_all_parsers_decline_returns_none.AlwaysDeclines]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.BuiltinParser]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_external_parser_beats_builtin_same_score.ExternalParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.AcceptingBuiltin]` is not assignable to parameter `parser_class` with type `type[ParserProtocol]` in function `paperless.parsers.registry.ParserRegistry.register_builtin`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestParserRegistryGetParserForFile.test_builtin_wins_when_external_declines.DecliningExternal]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless/tests/test_registry.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestLogSummary.test_log_summary_with_external_parsers.ExtParser]` is not assignable to parameter `object` with type `type[ParserProtocol]` in function `list.append`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/tests/test_signals.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/tests/test_signals.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "column": 21, + "path": "src/paperless/tests/test_views.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `streaming_content`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/urls.py", + "name": "bad-assignment", + "concise_description": "`((request: HttpRequest, *args: Unknown, **kwargs: Unknown) -> HttpResponseRedirect | Unknown) | ((view_func: Unknown) -> (request: HttpRequest, *args: Unknown, **kwargs: Unknown) -> HttpResponseRedirect | Unknown)` is not assignable to attribute `login` with type `(request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/urls.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `django.urls.conf.path` called with arguments: (Literal['ws/status/'], _ASGIApplicationProtocol)", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless/validators.py", + "name": "missing-attribute", + "concise_description": "Object of class `EllipsisType` has no attribute `lower`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless/validators.py", + "name": "bad-argument-type", + "concise_description": "Argument `EllipsisType | Unknown` is not assignable to parameter `text_or_uri_element` with type `_Element | bytes | str | None` in function `lxml.etree.QName.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless/validators.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `str.join` called with arguments: (Iterator[_AnyStr] | Unknown)", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless/validators.py", + "name": "missing-attribute", + "concise_description": "Object of class `EllipsisType` has no attribute `items`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "column": 17, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/views.py", + "name": "bad-override", + "concise_description": "Class member `UserViewSet.create` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/views.py", + "name": "bad-override", + "concise_description": "Class member `UserViewSet.update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/views.py", + "name": "bad-override", + "concise_description": "Class member `UserViewSet.destroy` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `set_password`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `save`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `save`", + "severity": "error" + }, + { + "column": 42, + "path": "src/paperless/views.py", + "name": "bad-argument-type", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser` is not assignable to parameter `user` with type `AbstractBaseUser` in function `allauth.mfa.adapter.DefaultMFAAdapter.build_totp_url`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless/views.py", + "name": "bad-assignment", + "concise_description": "`Authenticator | None` is not assignable to `Authenticator`", + "severity": "error" + }, + { + "column": 34, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of type `RecoveryCodes | TOTP | WebAuthn` has no attribute `get_unused_codes`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_backend`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_chunk_size`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_endpoint`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `llm_embedding_model`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `llm_context_size`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of type `AbstractBaseUser | AnonymousUser` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless/views.py", + "name": "missing-attribute", + "concise_description": "Object of class `Provider` has no attribute `get_brands`", + "severity": "error" + }, + { + "column": 41, + "path": "src/paperless_ai/ai_classifier.py", + "name": "bad-argument-type", + "concise_description": "Argument `ClassificationSuggestions` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", + "severity": "error" + }, + { + "column": 55, + "path": "src/paperless_ai/ai_classifier.py", + "name": "bad-argument-type", + "concise_description": "Argument `ClassificationSuggestions` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", + "severity": "error" + }, + { + "column": 46, + "path": "src/paperless_ai/ai_classifier.py", + "name": "bad-typed-dict-key", + "concise_description": "Invalid key for TypedDict `ClassificationSuggestions`, got `str`", + "severity": "error" + }, + { + "column": 53, + "path": "src/paperless_ai/ai_classifier.py", + "name": "bad-typed-dict-key", + "concise_description": "Invalid key for TypedDict `ClassificationSuggestions`, got `str`", + "severity": "error" + }, + { + "column": 36, + "path": "src/paperless_ai/ai_classifier.py", + "name": "bad-typed-dict-key", + "concise_description": "Invalid key for TypedDict `ClassificationSuggestions`, got `str`", + "severity": "error" + }, + { + "column": 65, + "path": "src/paperless_ai/base_model.py", + "name": "bad-index", + "concise_description": "Cannot index into `dict[str, FieldInfo]`", + "severity": "error" + }, + { + "column": 18, + "path": "src/paperless_ai/chat.py", + "name": "bad-assignment", + "concise_description": "`str | Any | None` is not assignable to dict value type `int | str`", + "severity": "error" + }, + { + "column": 26, + "path": "src/paperless_ai/chat.py", + "name": "missing-attribute", + "concise_description": "Object of class `Response` has no attribute `response_gen`", + "severity": "error" + }, + { + "column": 60, + "path": "src/paperless_ai/client.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | Unknown | None` is not assignable to parameter `s` with type `bytearray | bytes | str` in function `json.loads`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_ai/embedding.py", + "name": "bad-argument-type", + "concise_description": "Argument `str` is not assignable to parameter `key` with type `LLMEmbeddingBackend` in function `dict.get`", + "severity": "error" + }, + { + "column": 59, + "path": "src/paperless_ai/taxonomy.py", + "name": "not-iterable", + "concise_description": "Type `object` is not iterable", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless_ai/tests/test_ai_classifier.py", + "name": "bad-argument-type", + "concise_description": "Argument `dict[str, list[dict[str, float | int | str]] | list[Unknown]]` is not assignable to parameter `candidates` with type `TaxonomyCandidates | None` in function `paperless_ai.ai_classifier.build_prompt_without_rag`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_ai/tests/test_matching.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str | None]` is not assignable to parameter `names` with type `list[str]` in function `paperless_ai.matching.match_tags_by_name`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[float] | None` is not assignable to parameter `embedding` with type `list[float]` in function `_query`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "unsupported-operation", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `iterable` with type `Iterable[str]` in function `sorted`", + "severity": "error" + }, + { + "column": 20, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `obj` with type `Sized` in function `len`", + "severity": "error" + }, + { + "column": 45, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "no-matching-overload", + "concise_description": "No matching overload found for function `sorted` called with arguments: (list[float] | None, reverse=Literal[True])", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `iterable` with type `Iterable[str]` in function `sorted`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `iterable` with type `Iterable[str]` in function `sorted`", + "severity": "error" + }, + { + "column": 36, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['1']` is not assignable to parameter `document_id` with type `int` in function `make_node`", + "severity": "error" + }, + { + "column": 58, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['2']` is not assignable to parameter `document_id` with type `int` in function `make_node`", + "severity": "error" + }, + { + "column": 23, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `iterable` with type `Iterable[str]` in function `sorted`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "not-iterable", + "concise_description": "`in` is not supported between `Literal['c1']` and `None`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-assignment", + "concise_description": "`int` is not assignable to attribute `SCHEMA_VERSION` with type `Literal[2]`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-assignment", + "concise_description": "`int` is not assignable to attribute `SCHEMA_VERSION` with type `Literal[2]`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_ai/tests/test_vector_store.py", + "name": "bad-assignment", + "concise_description": "`int` is not assignable to attribute `SCHEMA_VERSION` with type `Literal[2]`", + "severity": "error" + }, + { + "column": 31, + "path": "src/paperless_ai/vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `float | int | list[float] | list[int] | list[str] | str | None` is not assignable to parameter `x` with type `Buffer | SupportsIndex | SupportsInt | str` in function `int.__new__`", + "severity": "error" + }, + { + "column": 31, + "path": "src/paperless_ai/vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `float | int | list[float] | list[int] | list[str] | str | None` is not assignable to parameter `x` with type `Buffer | SupportsIndex | SupportsInt | str` in function `int.__new__`", + "severity": "error" + }, + { + "column": 29, + "path": "src/paperless_ai/vector_store.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | Any | None` is not assignable to parameter `x` with type `Buffer | SupportsIndex | SupportsInt | str` in function `int.__new__`", + "severity": "error" + }, + { + "column": 64, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | Unknown | None` is not assignable to parameter `*args` with type `str` in function `imaplib.IMAP4.uid`", + "severity": "error" + }, + { + "column": 33, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str] | None` is not assignable to parameter `flag_set` with type `Iterable[str] | str` in function `imap_tools.mailbox.BaseMailBox.flag`", + "severity": "error" + }, + { + "column": 53, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `BaseMailAction.post_consume`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `TagMailAction.__init__`", + "severity": "error" + }, + { + "column": 30, + "path": "src/paperless_mail/mail.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "column": 27, + "path": "src/paperless_mail/mail.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "column": 29, + "path": "src/paperless_mail/mail.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 38, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 32, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_mail/mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `PinnedClientMixin` has no attribute `_host`", + "severity": "error" + }, + { + "column": 13, + "path": "src/paperless_mail/mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `PinnedClientMixin` has no attribute `_port`", + "severity": "error" + }, + { + "column": 21, + "path": "src/paperless_mail/mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `PinnedClientMixin` has no attribute `_timeout`", + "severity": "error" + }, + { + "column": 12, + "path": "src/paperless_mail/mail.py", + "name": "bad-return", + "concise_description": "Returned type `PinnedMailBox | PinnedMailBoxStartTls | PinnedMailBoxUnencrypted` is not assignable to declared return type `MailBox`", + "severity": "error" + }, + { + "column": 31, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.insert`", + "severity": "error" + }, + { + "column": 44, + "path": "src/paperless_mail/mail.py", + "name": "unbound-name", + "concise_description": "`folder` is uninitialized", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/mail.py", "name": "missing-attribute", - "description": "Object of class `Message` has no attribute `_headers`", "concise_description": "Object of class `Message` has no attribute `_headers`", "severity": "error" }, { - "line": 85, - "column": 51, - "stop_line": 85, - "stop_column": 72, - "path": "src/paperless_mail/tests/test_preprocessor.py", - "code": -2, + "column": 32, + "path": "src/paperless_mail/mail.py", "name": "missing-attribute", - "description": "Object of class `Crypt` has no attribute `stderr`", - "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "concise_description": "Object of class `Message` has no attribute `_headers`", "severity": "error" }, { - "line": 100, - "column": 36, - "stop_line": 100, - "stop_column": 66, - "path": "src/paperless_mail/tests/test_preprocessor.py", - "code": -2, + "column": 32, + "path": "src/paperless_mail/mail.py", "name": "missing-attribute", - "description": "Object of class `str` has no attribute `decode`\n Did you mean `encode`?", - "concise_description": "Object of class `str` has no attribute `decode`", + "concise_description": "Object of class `Message` has no attribute `_headers`", "severity": "error" }, { - "line": 298, - "column": 28, - "stop_line": 298, - "stop_column": 34, - "path": "src/paperless_mail/views.py", - "code": -2, + "column": 17, + "path": "src/paperless_mail/mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "column": 27, + "path": "src/paperless_mail/mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "column": 39, + "path": "src/paperless_mail/oauth.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "severity": "error" + }, + { + "column": 39, + "path": "src/paperless_mail/oauth.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "severity": "error" + }, + { + "column": 35, + "path": "src/paperless_mail/oauth.py", "name": "unbound-name", - "description": "`result` may be uninitialized", "concise_description": "`result` may be uninitialized", "severity": "error" }, { - "line": 304, + "column": 71, + "path": "src/paperless_mail/preprocessor.py", + "name": "missing-attribute", + "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "severity": "error" + }, + { + "column": 44, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-argument-type", + "concise_description": "Argument `None` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "column": 37, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-argument-type", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless_mail/tests/helpers.py", + "name": "bad-return", + "concise_description": "Returned type `list[str | None]` is not assignable to declared return type `list[str]`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "severity": "error" + }, + { + "column": 25, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "severity": "error" + }, + { + "column": 25, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/helpers.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "severity": "error" + }, + { + "column": 41, + "path": "src/paperless_mail/tests/test_api.py", + "name": "unsupported-operation", + "concise_description": "Cannot set item in `dict[str, MailAccount.ImapSecurity | str]`", + "severity": "error" + }, + { + "column": 50, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Class `message2` has no class attribute `from_`", + "severity": "error" + }, + { + "column": 54, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_correspondent.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "column": 45, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 54, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 45, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 54, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 45, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 54, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "column": 49, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "column": 41, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `list[str | None]` is not assignable to parameter `uid` with type `Iterable[str] | UidRange | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "missing-attribute", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "column": 51, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-assignment", + "concise_description": "`int` is not assignable to dict value type `str`", + "severity": "error" + }, + { + "column": 51, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-assignment", + "concise_description": "`None` is not assignable to dict value type `str`", + "severity": "error" + }, + { + "column": 41, + "path": "src/paperless_mail/tests/test_mail.py", + "name": "bad-argument-type", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "column": 42, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "column": 42, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "column": 46, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "column": 46, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "name": "missing-attribute", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "column": 9, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "name": "missing-attribute", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "column": 27, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "name": "missing-attribute", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "column": 51, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "name": "missing-attribute", + "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "severity": "error" + }, + { + "column": 36, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "name": "missing-attribute", + "concise_description": "Object of class `str` has no attribute `decode`", + "severity": "error" + }, + { + "column": 28, + "path": "src/paperless_mail/views.py", + "name": "unbound-name", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { "column": 29, - "stop_line": 304, - "stop_column": 40, "path": "src/paperless_mail/views.py", - "code": -2, "name": "unbound-name", - "description": "`imap_server` may be uninitialized", "concise_description": "`imap_server` may be uninitialized", "severity": "error" }, { - "line": 308, "column": 26, - "stop_line": 308, - "stop_column": 34, "path": "src/paperless_mail/views.py", - "code": -2, "name": "unbound-name", - "description": "`defaults` may be uninitialized", "concise_description": "`defaults` may be uninitialized", "severity": "error" + }, + { + "column": 24, + "path": "src/paperless_testing/http.py", + "name": "bad-argument-type", + "concise_description": "Argument `AsyncIterator[bytes] | Iterator[bytes]` is not assignable to parameter `iterable_of_bytes` with type `Iterable[Buffer]` in function `bytes.join`", + "severity": "error" + }, + { + "column": 16, + "path": "src/paperless_testing/migrations.py", + "name": "missing-attribute", + "concise_description": "Object of class `NoneType` has no attribute `name`", + "severity": "error" } ] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 43a62746b..f0c9f528c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,26 +43,17 @@ Once you have submitted a **P**ull **R**equest it will be reviewed, approved, an Important: Pull requests that implement a new feature or enhancement _should almost always target an existing feature request_ with evidence of community interest and discussion. This is in order to balance the work of implementing and maintaining new features / enhancements. Instead of opening a PR which does not meet this requirement, please open a feature request instead, to gather feedback from both users and the project maintainers. -## Non-Trivial Requests +## PR Review Process -PRs deemed `non-trivial` will go through a stricter review process before being merged into `dev`. This is to ensure code quality and complete functionality (free of side effects). - -Examples of `non-trivial` PRs might include: - -- Additional features -- Large changes to many distinct files -- Breaking or deprecation of existing features - -Our community review process for `non-trivial` PRs is the following: +Our community review process for PRs is the following: 1. Must pass usual automated code tests and formatting checks. 2. The PR will be assigned and pinged to the appropriately experienced team (i.e. @paperless-ngx/backend for backend changes). 3. Development team will check and test code manually (possibly over several days). - You may be asked to make changes or rebase. - - The team may ask for additional testing done by @paperless-ngx/test -4. **At least two** members of the team will approve and finally merge the request into `dev` 🎉. +4. One or more members of the team will approve and finally merge the request into `dev` 🎉. -This process might be slow as community members have different schedules and time to dedicate to the Paperless project. However it ensures community code reviews are as brilliantly thorough as they once were with @jonaswinkler. +This process might be slow as community members have different schedules and time to dedicate to the Paperless project. However it ensures community code reviews are thorough and of high quality. # Use of AI Tools diff --git a/Dockerfile b/Dockerfile index 1d45e1b1a..50a15aa81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ RUN set -eux \ # Purpose: Installs s6-overlay and rootfs # Comments: # - Don't leave anything extra in here either -FROM ghcr.io/astral-sh/uv:0.12.9-python3.14-trixie-slim AS s6-overlay-base +FROM ghcr.io/astral-sh/uv:0.12.23-python3.14-trixie-slim AS s6-overlay-base WORKDIR /usr/src/s6 @@ -171,7 +171,9 @@ RUN set -eux \ && cp /etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml \ && echo "Cleaning up image layer" \ && rm --force --verbose *.deb \ - && rm --recursive --force --verbose /var/lib/apt/lists/* + && rm --recursive --force --verbose /var/lib/apt/lists/* \ + && echo "Configuring interactive shells to source the s6 container environment" \ + && echo '. /etc/profile.d/contenv.sh' >> /etc/bash.bashrc WORKDIR /usr/src/paperless/src/ @@ -199,10 +201,6 @@ RUN set -eux \ --index https://download.pytorch.org/whl/cpu \ --index-strategy unsafe-best-match \ --requirements requirements.txt \ - && echo "Installing NLTK data" \ - && python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" snowball_data \ - && python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" stopwords \ - && python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" punkt_tab \ && echo "Cleaning up image" \ && apt-get --yes purge ${BUILD_PACKAGES} \ && apt-get --yes autoremove --purge \ diff --git a/README.md b/README.md index c17f99e92..f1e514104 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Paperless-ngx is a document management system that transforms your physical docu Paperless-ngx is the official successor to the original [Paperless](https://github.com/the-paperless-project/paperless) & [Paperless-ng](https://github.com/jonaswinkler/paperless-ng) projects and is designed to distribute the responsibility of advancing and supporting the project among a team of people. [Consider joining us!](#community-support) -Thanks to the generous folks at [DigitalOcean](https://m.do.co/c/8d70b916d462), a demo is available at [demo.paperless-ngx.com](https://demo.paperless-ngx.com) using login `demo` / `demo`. _Note: demo content is reset frequently and confidential information should not be uploaded._ +Thanks to the generous folks at [Fyra Stack](https://fyrastack.com), a demo is available at [demo.paperless-ngx.com](https://demo.paperless-ngx.com) using login `demo` / `demo`. _Note: demo content is reset frequently and confidential information should not be uploaded._ - [Features](#features) - [Getting started](#getting-started) @@ -33,13 +33,9 @@ Thanks to the generous folks at [DigitalOcean](https://m.do.co/c/8d70b916d462), - [Related Projects](#related-projects) - [Important Note](#important-note) -

This project is supported by:
- - - - - - +

Demo hosting provided by:
+
+ Fyra Stack

diff --git a/docker/compose/docker-compose.ci-test.yml b/docker/compose/docker-compose.ci-test.yml index 5f9b55e06..899cd9443 100644 --- a/docker/compose/docker-compose.ci-test.yml +++ b/docker/compose/docker-compose.ci-test.yml @@ -4,7 +4,7 @@ # correct networking for the tests services: gotenberg: - image: docker.io/gotenberg/gotenberg:8.36 + image: docker.io/gotenberg/gotenberg:8.37 hostname: gotenberg container_name: gotenberg network_mode: host @@ -14,7 +14,7 @@ services: command: - "gotenberg" - "--chromium-disable-javascript=true" - - "--chromium-allow-list=file:///tmp/.*" + - "--chromium-allow-list=^file:///tmp/.*" - "--log-level=warn" - "--log-format=text" tika: @@ -24,7 +24,7 @@ services: network_mode: host restart: unless-stopped greenmail: - image: docker.io/greenmail/standalone:2.1.13 + image: docker.io/greenmail/standalone:2.1.14 hostname: greenmail container_name: greenmail environment: @@ -35,7 +35,7 @@ services: - "3143:3143" # IMAP restart: unless-stopped nginx: - image: docker.io/nginx:1.31.5-alpine + image: docker.io/nginx:1.31.6-alpine hostname: nginx container_name: nginx ports: diff --git a/docker/compose/docker-compose.mariadb-tika.yml b/docker/compose/docker-compose.mariadb-tika.yml index 1384e2b1c..7e48f80c0 100644 --- a/docker/compose/docker-compose.mariadb-tika.yml +++ b/docker/compose/docker-compose.mariadb-tika.yml @@ -40,7 +40,6 @@ services: volumes: - dbdata:/var/lib/mysql environment: - MARIADB_HOST: paperless MARIADB_DATABASE: paperless MARIADB_USER: paperless MARIADB_PASSWORD: paperless @@ -72,14 +71,14 @@ services: PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.36 + image: docker.io/gotenberg/gotenberg:8.37 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. command: - "gotenberg" - "--chromium-disable-javascript=true" - - "--chromium-allow-list=file:///tmp/.*" + - "--chromium-allow-list=^file:///tmp/.*" tika: image: docker.io/apache/tika:3.3.1.0 restart: unless-stopped diff --git a/docker/compose/docker-compose.mariadb.yml b/docker/compose/docker-compose.mariadb.yml index 8f828d3b1..288229379 100644 --- a/docker/compose/docker-compose.mariadb.yml +++ b/docker/compose/docker-compose.mariadb.yml @@ -36,7 +36,6 @@ services: volumes: - dbdata:/var/lib/mysql environment: - MARIADB_HOST: paperless MARIADB_DATABASE: paperless MARIADB_USER: paperless MARIADB_PASSWORD: paperless diff --git a/docker/compose/docker-compose.postgres-tika.yml b/docker/compose/docker-compose.postgres-tika.yml index 136fdc5e4..9f7003cac 100644 --- a/docker/compose/docker-compose.postgres-tika.yml +++ b/docker/compose/docker-compose.postgres-tika.yml @@ -67,14 +67,14 @@ services: PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.36 + image: docker.io/gotenberg/gotenberg:8.37 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. command: - "gotenberg" - "--chromium-disable-javascript=true" - - "--chromium-allow-list=file:///tmp/.*" + - "--chromium-allow-list=^file:///tmp/.*" tika: image: docker.io/apache/tika:3.3.1.0 restart: unless-stopped diff --git a/docker/compose/docker-compose.sqlite-tika.yml b/docker/compose/docker-compose.sqlite-tika.yml index b401e7e1c..6fad60ff8 100644 --- a/docker/compose/docker-compose.sqlite-tika.yml +++ b/docker/compose/docker-compose.sqlite-tika.yml @@ -56,14 +56,14 @@ services: PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.36 + image: docker.io/gotenberg/gotenberg:8.37 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. command: - "gotenberg" - "--chromium-disable-javascript=true" - - "--chromium-allow-list=file:///tmp/.*" + - "--chromium-allow-list=^file:///tmp/.*" tika: image: docker.io/apache/tika:3.3.1.0 restart: unless-stopped diff --git a/docker/rootfs/etc/profile.d/contenv.sh b/docker/rootfs/etc/profile.d/contenv.sh new file mode 100755 index 000000000..be5f3ba1c --- /dev/null +++ b/docker/rootfs/etc/profile.d/contenv.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Source s6 container environment for interactive shells. +# Ensures variables resolved from *_FILE secret injection are visible +# when using 'docker exec bash'. Does not affect s6 services (those +# use with-contenv directly). Has no effect in non-container contexts +# because the directory will not exist. +# Note: sh/dash shells opened via 'docker exec sh' are not covered; +# only bash-based sessions benefit from this file. +_pngx_contenv="/run/s6/container_environment" +if [ -d "${_pngx_contenv}" ]; then + for _pngx_f in "${_pngx_contenv}"/*; do + [ -f "${_pngx_f}" ] || continue + _pngx_name=$(basename "${_pngx_f}") + _pngx_val=$(cat "${_pngx_f}") + export "${_pngx_name}=${_pngx_val}" + done +fi +unset _pngx_contenv _pngx_f _pngx_name _pngx_val diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/dependencies.d/init-modify-user b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/dependencies.d/init-modify-user new file mode 100644 index 000000000..e69de29bb diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/dependencies.d/init-start b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/dependencies.d/init-start new file mode 100644 index 000000000..e69de29bb diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/run new file mode 100755 index 000000000..1d7ba32ec --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/run @@ -0,0 +1,58 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash +declare -r log_prefix="[init-compile-bytecode]" + +# PYTHONDONTWRITEBYTECODE=1 is set for the whole container. This unit compiles a +# scoped set of libraries anyway, to speed up startup without bloating image size. + +# Handle the people using a read only file system +if [[ "${S6_READ_ONLY_ROOT}" == "1" ]]; then + echo "${log_prefix} S6_READ_ONLY_ROOT=1, skipping (nothing to write bytecode to)" + exit 0 +fi + +# When running as a non-root user, site-packages is still root-owned and unwritable, +# so this step would just fail loudly on every container start. Skip it. +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + echo "${log_prefix} USER_IS_NON_ROOT is set, skipping (site-packages is not writable)" + exit 0 +fi + +declare -r site_packages="$(python3 -c 'import site; print(site.getsitepackages()[0])')" + +# Deliberately scoped to packages that paperless.settings/paperless/__init__.py import +# unconditionally on every manage.py invocation (Django itself, the always-loaded +# INSTALLED_APPS, and celery). This is NOT "compile everything" - the optional AI stack +# (torch, llama-index, sentence-transformers, ...) is intentionally excluded since it is +# lazy-imported and large. +declare -a scope=( + "${PAPERLESS_SRC_DIR}" + "${site_packages}/django" + "${site_packages}/celery" + "${site_packages}/kombu" + "${site_packages}/rest_framework" + "${site_packages}/django_filters" + "${site_packages}/whitenoise" + "${site_packages}/corsheaders" + "${site_packages}/django_extensions" + "${site_packages}/guardian" + "${site_packages}/allauth" + "${site_packages}/drf_spectacular" + "${site_packages}/drf_spectacular_sidecar" + "${site_packages}/treenode" + "${site_packages}/compression_middleware" +) + +declare -a existing_scope=() +for path in "${scope[@]}"; do + [[ -d "${path}" ]] && existing_scope+=("${path}") +done + +echo "${log_prefix} Compiling bytecode for: ${existing_scope[*]}" +declare -r start_seconds=${SECONDS} + +if ! PYTHONDONTWRITEBYTECODE= python3 -m compileall -q "${existing_scope[@]}"; then + echo "${log_prefix} WARNING: compileall reported errors (read-only filesystem or unwritable site-packages?); continuing without a bytecode cache" +fi + +echo "${log_prefix} Done in $((SECONDS - start_seconds))s" diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/type new file mode 100644 index 000000000..bdd22a185 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/up b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/up new file mode 100644 index 000000000..741d51531 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-compile-bytecode/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-compile-bytecode/run diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/dependencies.d/init-compile-bytecode b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/dependencies.d/init-compile-bytecode new file mode 100644 index 000000000..e69de29bb diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run index a3e4b6a3e..202adbf68 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run @@ -2,6 +2,7 @@ # shellcheck shell=bash declare -r log_prefix="[svc-flower]" +declare -r flower_config="${PAPERLESS_SRC_DIR}/paperless/flowerconfig.py" echo "${log_prefix} Checking if we should start flower..." @@ -9,12 +10,20 @@ if [[ -n "${PAPERLESS_ENABLE_FLOWER}" ]]; then # Small delay to allow celery to be up first echo "${log_prefix} Starting flower in 5s" sleep 5 - cd ${PAPERLESS_SRC_DIR} + cd "${PAPERLESS_SRC_DIR}" || exit 1 + + # Only pass --conf if the file is actually there. The image does not ship one, and + # flower >= 2.1.0 exits with FileNotFoundError when an explicitly given --conf path + # does not exist (mher/flower#1391). Earlier versions silently ignored it. + declare -a conf_args=() + if [[ -f "${flower_config}" ]]; then + conf_args=(--conf="${flower_config}") + fi if [[ -n "${USER_IS_NON_ROOT}" ]]; then - exec /usr/local/bin/celery --app paperless flower --conf=${PAPERLESS_SRC_DIR}/paperless/flowerconfig.py + exec /usr/local/bin/celery --app paperless flower "${conf_args[@]}" else - exec s6-setuidgid paperless /usr/local/bin/celery --app paperless flower --conf=${PAPERLESS_SRC_DIR}/paperless/flowerconfig.py + exec s6-setuidgid paperless /usr/local/bin/celery --app paperless flower "${conf_args[@]}" fi else diff --git a/docs/administration.md b/docs/administration.md index 4c855b3a2..155716660 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -521,7 +521,8 @@ Pass `--recreate` to wipe the existing index before rebuilding. Use this when th index is corrupted or you want a fully clean rebuild. Pass `--if-needed` to skip the rebuild if the index is already up to date (schema -version and search language match). Safe to run on every startup or upgrade. +version, schema fingerprint and search language all match). Safe to run on every +startup or upgrade. Specify `optimize` to optimize the index. This command is regularly invoked by the task scheduler. diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md index 661c2d704..59cfa5a0b 100644 --- a/docs/advanced_usage.md +++ b/docs/advanced_usage.md @@ -136,13 +136,15 @@ for suggested generation and embedding models. ### AI-assisted suggestions With AI enabled, Paperless-ngx can suggest a title, tags, correspondent, document type, -storage path and dates by sending the document to the LLM. This is **opt-in per request** -and surfaces through the "Suggest" control on the document detail page, alongside the -classic classifier-based suggestions — it does not disable them. Suggestions are requested -automatically when you open a document that carries an inbox tag unless "Automatically request -suggestions for inbox documents" under Settings > Documents is disabled. Suggestion output -language can be steered with -[`PAPERLESS_AI_LLM_OUTPUT_LANGUAGE`](configuration.md#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE) +storage path and dates by sending the document to the LLM using "Suggest" button on the document +detail page. You can choose which type of suggestions are requested by default under Settings > +Documents, either ML (classifier-based) suggestions, AI suggestions, or both. When both are requested +the results are combined. + +Suggestions are requested automatically when you open a document that carries an inbox tag +unless "Automatically request suggestions for inbox documents" under Settings > Documents is disabled. + +Suggestion output language can be steered with [`PAPERLESS_AI_LLM_OUTPUT_LANGUAGE`](configuration.md#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE) (otherwise it follows the user's UI language). ### The LLM index (RAG) and similar documents @@ -153,8 +155,11 @@ in similar existing documents, and the document chat can retrieve relevant conte Enable it by setting [`PAPERLESS_AI_LLM_EMBEDDING_BACKEND`](configuration.md#PAPERLESS_AI_LLM_EMBEDDING_BACKEND) -(`huggingface` for fully-local embeddings, or `ollama` / `openai-like`). The index is only -built when AI is enabled **and** an embedding backend is set. +(`huggingface` for fully-local embeddings, or `ollama` / `openai-like`). By default, the main +LLM API key and endpoint are used, but an optional embedding-specific[API key](configuration.md#PAPERLESS_AI_LLM_EMBEDDING_API_KEY) +and [endpoint](configuration.md#PAPERLESS_AI_LLM_EMBEDDING_ENDPOINT) can be configured. + +The index is only built when AI is enabled **and** an embedding backend is set. The index is updated automatically on a schedule controlled by [`PAPERLESS_LLM_INDEX_TASK_CRON`](configuration.md#PAPERLESS_LLM_INDEX_TASK_CRON) (daily by @@ -1005,6 +1010,19 @@ documents to both separate and categorize them in a single operation. **Example:** A 6-page scan with TAG:invoice on page 3 and TAG:receipt on page 5 will create three documents: pages 1-2 (no tags), pages 3-4 (tagged "invoice"), and pages 5-6 (tagged "receipt"). +### Barcode Contents {#barcode-contents} + +By default, Paperless only uses barcodes for splitting, ASNs and tags. With +[`PAPERLESS_CONSUMER_STORE_BARCODE_VALUES`](configuration.md#PAPERLESS_CONSUMER_STORE_BARCODE_VALUES) +enabled, it stores the content of every barcode with the document, e.g. payment codes or QR codes. + +- Barcodes are listed on the **Metadata** tab with page, type and content, and can be copied. +- The API returns them in the `barcodes` field of `/api/documents/{id}/metadata/`. +- They can be [searched](usage.md#searching-barcodes), e.g. `barcodes:DE89370400440532013000`. +- Only the first [`PAPERLESS_CONSUMER_BARCODE_MAX_PAGES`](configuration.md#PAPERLESS_CONSUMER_BARCODE_MAX_PAGES) + pages are scanned. Reprocessing reads the barcodes of existing documents. +- Each version keeps its own barcodes, and the newest version's are shown and searched. + ## Automatic collation of double-sided documents {#collate} !!! note diff --git a/docs/assets/extra.css b/docs/assets/extra.css index c93e467fd..e1a657273 100644 --- a/docs/assets/extra.css +++ b/docs/assets/extra.css @@ -101,3 +101,32 @@ h4 code { border-top: .05rem solid var(--md-default-fg-color--lightest); } } + +.md-typeset .demo-sponsor { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: .35rem; + margin-top: -1rem; + margin-bottom: 2rem; + color: var(--md-default-fg-color--light); + font-size: .65rem; +} + +.md-typeset .demo-sponsor a { + display: inline-flex; + align-items: center; + gap: .25rem; + color: inherit; + font-weight: 600; +} + +.md-typeset .demo-sponsor a:hover { + color: var(--md-accent-fg-color); +} + +.md-typeset .demo-sponsor img { + width: 1rem; + height: 1rem; + flex-shrink: 0; +} diff --git a/docs/assets/sponsors/fyra-stack.svg b/docs/assets/sponsors/fyra-stack.svg new file mode 100644 index 000000000..ba5662286 --- /dev/null +++ b/docs/assets/sponsors/fyra-stack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/changelog.md b/docs/changelog.md index a26347764..d65f55323 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,443 @@ # Changelog +## paperless-ngx 3.3.3 + +### Bug Fixes + +- Fix: fix global search input layout shifting [@shamoon](https://github.com/shamoon) ([#14491](https://github.com/paperless-ngx/paperless-ngx/pull/14491)) +- Fix: dont include doc content on global search results [@shamoon](https://github.com/shamoon) ([#14488](https://github.com/paperless-ngx/paperless-ngx/pull/14488)) +- Fix: remove some redundant pagers [@shamoon](https://github.com/shamoon) ([#14487](https://github.com/paperless-ngx/paperless-ngx/pull/14487)) +- Fix: prevent weird wrapping of dashboard widget column titles [@shamoon](https://github.com/shamoon) ([#14486](https://github.com/paperless-ngx/paperless-ngx/pull/14486)) +- Fix: dont paginate 'all' tasks view across sections [@shamoon](https://github.com/shamoon) ([#14484](https://github.com/paperless-ngx/paperless-ngx/pull/14484)) +- Fix: use float parsing for importer manifest records with a passphrase [@stumpylog](https://github.com/stumpylog) ([#14483](https://github.com/paperless-ngx/paperless-ngx/pull/14483)) +- Fix: respect subpath in logout, share link and auto-login redirects [@jaimevelaz](https://github.com/jaimevelaz) ([#14476](https://github.com/paperless-ngx/paperless-ngx/pull/14476)) +- Fix: dont tie suggestions button to ai enabled any more [@shamoon](https://github.com/shamoon) ([#14478](https://github.com/paperless-ngx/paperless-ngx/pull/14478)) +- Fix: handle single-class classifier in threshold prediction (#14471) [@stumpylog](https://github.com/stumpylog) ([#14473](https://github.com/paperless-ngx/paperless-ngx/pull/14473)) +- Fix: keep counter and extension when shortening long public filenames [@stumpylog](https://github.com/stumpylog) ([#14472](https://github.com/paperless-ngx/paperless-ngx/pull/14472)) + +### All App Changes + +
+10 changes + +- Fix: fix global search input layout shifting [@shamoon](https://github.com/shamoon) ([#14491](https://github.com/paperless-ngx/paperless-ngx/pull/14491)) +- Fix: dont include doc content on global search results [@shamoon](https://github.com/shamoon) ([#14488](https://github.com/paperless-ngx/paperless-ngx/pull/14488)) +- Fix: remove some redundant pagers [@shamoon](https://github.com/shamoon) ([#14487](https://github.com/paperless-ngx/paperless-ngx/pull/14487)) +- Fix: prevent weird wrapping of dashboard widget column titles [@shamoon](https://github.com/shamoon) ([#14486](https://github.com/paperless-ngx/paperless-ngx/pull/14486)) +- Fix: dont paginate 'all' tasks view across sections [@shamoon](https://github.com/shamoon) ([#14484](https://github.com/paperless-ngx/paperless-ngx/pull/14484)) +- Fix: use float parsing for importer manifest records with a passphrase [@stumpylog](https://github.com/stumpylog) ([#14483](https://github.com/paperless-ngx/paperless-ngx/pull/14483)) +- Fix: respect subpath in logout, share link and auto-login redirects [@jaimevelaz](https://github.com/jaimevelaz) ([#14476](https://github.com/paperless-ngx/paperless-ngx/pull/14476)) +- Fix: dont tie suggestions button to ai enabled any more [@shamoon](https://github.com/shamoon) ([#14478](https://github.com/paperless-ngx/paperless-ngx/pull/14478)) +- Fix: handle single-class classifier in threshold prediction (#14471) [@stumpylog](https://github.com/stumpylog) ([#14473](https://github.com/paperless-ngx/paperless-ngx/pull/14473)) +- Fix: keep counter and extension when shortening long public filenames [@stumpylog](https://github.com/stumpylog) ([#14472](https://github.com/paperless-ngx/paperless-ngx/pull/14472)) + +
+ +## paperless-ngx 3.3.2 + +### Bug Fixes + +- Fix: copy only direct user grants in DocumentMetadataOverrides.from\_document [@stumpylog](https://github.com/stumpylog) ([#14452](https://github.com/paperless-ngx/paperless-ngx/pull/14452)) +- Fix: support combined text/query searches [@shamoon](https://github.com/shamoon) ([#14443](https://github.com/paperless-ngx/paperless-ngx/pull/14443)) +- Fix: make exporter derived file names unique when originals differ only by extension [@stumpylog](https://github.com/stumpylog) ([#14429](https://github.com/paperless-ngx/paperless-ngx/pull/14429)) + +### Dependencies + +- Chore(deps): Bump filelock from 3.32.6 to 4.0.12 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14336](https://github.com/paperless-ngx/paperless-ngx/pull/14336)) +- Chore(deps): Bump the uv group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14418](https://github.com/paperless-ngx/paperless-ngx/pull/14418)) + +### All App Changes + +
+5 changes + +- Fix: copy only direct user grants in DocumentMetadataOverrides.from\_document [@stumpylog](https://github.com/stumpylog) ([#14452](https://github.com/paperless-ngx/paperless-ngx/pull/14452)) +- Chore(deps): Bump filelock from 3.32.6 to 4.0.12 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14336](https://github.com/paperless-ngx/paperless-ngx/pull/14336)) +- Fix: support combined text/query searches [@shamoon](https://github.com/shamoon) ([#14443](https://github.com/paperless-ngx/paperless-ngx/pull/14443)) +- Chore(deps): Bump the uv group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14418](https://github.com/paperless-ngx/paperless-ngx/pull/14418)) +- Fix: make exporter derived file names unique when originals differ only by extension [@stumpylog](https://github.com/stumpylog) ([#14429](https://github.com/paperless-ngx/paperless-ngx/pull/14429)) + +
+ +## paperless-ngx 3.3.1 + +### Bug Fixes + +- Fix: use a root document's effective content for the LLM index and pr… [@stumpylog](https://github.com/stumpylog) ([#14423](https://github.com/paperless-ngx/paperless-ngx/pull/14423)) +- Fix: index document versions as their root document [@stumpylog](https://github.com/stumpylog) ([#14422](https://github.com/paperless-ngx/paperless-ngx/pull/14422)) +- Fix: authorize document versions by their root in the single-object permission check [@stumpylog](https://github.com/stumpylog) ([#14421](https://github.com/paperless-ngx/paperless-ngx/pull/14421)) +- Fix: Provide better error messages to users for invalid JSON [@stumpylog](https://github.com/stumpylog) ([#14419](https://github.com/paperless-ngx/paperless-ngx/pull/14419)) +- Fix: authorize document versions by their root and speed up permission id sets [@stumpylog](https://github.com/stumpylog) ([#14396](https://github.com/paperless-ngx/paperless-ngx/pull/14396)) +- Chore: update the db options warning [@shamoon](https://github.com/shamoon) ([#14398](https://github.com/paperless-ngx/paperless-ngx/pull/14398)) +- Fix: bulk reprocess latest version for root documents [@shamoon](https://github.com/shamoon) ([#14385](https://github.com/paperless-ngx/paperless-ngx/pull/14385)) +- Fix: consistently use root doc for version action permissions [@shamoon](https://github.com/shamoon) ([#14384](https://github.com/paperless-ngx/paperless-ngx/pull/14384)) +- Fix: Don't attempt to index created dates which are not representable in the FTS index [@stumpylog](https://github.com/stumpylog) ([#14390](https://github.com/paperless-ngx/paperless-ngx/pull/14390)) +- Fix: retry a search index rebuild that was interrupted [@stumpylog](https://github.com/stumpylog) ([#14379](https://github.com/paperless-ngx/paperless-ngx/pull/14379)) + +### Documentation + +- Chore: silence gotenberg startup warning [@slankes](https://github.com/slankes) ([#14405](https://github.com/paperless-ngx/paperless-ngx/pull/14405)) +- Documentation: remove MARIADB\_HOST from MariaDB compose files [@shamoon](https://github.com/shamoon) ([#14378](https://github.com/paperless-ngx/paperless-ngx/pull/14378)) +- Documentation: Updates the troubleshooting with 2 common database collation issues [@stumpylog](https://github.com/stumpylog) ([#14370](https://github.com/paperless-ngx/paperless-ngx/pull/14370)) + +### Maintenance + +- Chore: Upgrade runners to Ubuntu 26.04 [@stumpylog](https://github.com/stumpylog) ([#14347](https://github.com/paperless-ngx/paperless-ngx/pull/14347)) + +### Dependencies + +- Chore(deps): Bump the npm\_and\_yarn group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14417](https://github.com/paperless-ngx/paperless-ngx/pull/14417)) + +### All App Changes + +
+12 changes + +- Chore: share the authorizing owner rule between the id sets and the trash filter [@stumpylog](https://github.com/stumpylog) ([#14425](https://github.com/paperless-ngx/paperless-ngx/pull/14425)) +- Fix: use a root document's effective content for the LLM index and pr… [@stumpylog](https://github.com/stumpylog) ([#14423](https://github.com/paperless-ngx/paperless-ngx/pull/14423)) +- Fix: index document versions as their root document [@stumpylog](https://github.com/stumpylog) ([#14422](https://github.com/paperless-ngx/paperless-ngx/pull/14422)) +- Fix: authorize document versions by their root in the single-object permission check [@stumpylog](https://github.com/stumpylog) ([#14421](https://github.com/paperless-ngx/paperless-ngx/pull/14421)) +- Fix: Provide better error messages to users for invalid JSON [@stumpylog](https://github.com/stumpylog) ([#14419](https://github.com/paperless-ngx/paperless-ngx/pull/14419)) +- Chore(deps): Bump the npm\_and\_yarn group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14417](https://github.com/paperless-ngx/paperless-ngx/pull/14417)) +- Fix: authorize document versions by their root and speed up permission id sets [@stumpylog](https://github.com/stumpylog) ([#14396](https://github.com/paperless-ngx/paperless-ngx/pull/14396)) +- Chore: update the db options warning [@shamoon](https://github.com/shamoon) ([#14398](https://github.com/paperless-ngx/paperless-ngx/pull/14398)) +- Fix: bulk reprocess latest version for root documents [@shamoon](https://github.com/shamoon) ([#14385](https://github.com/paperless-ngx/paperless-ngx/pull/14385)) +- Fix: consistently use root doc for version action permissions [@shamoon](https://github.com/shamoon) ([#14384](https://github.com/paperless-ngx/paperless-ngx/pull/14384)) +- Fix: Don't attempt to index created dates which are not representable in the FTS index [@stumpylog](https://github.com/stumpylog) ([#14390](https://github.com/paperless-ngx/paperless-ngx/pull/14390)) +- Fix: retry a search index rebuild that was interrupted [@stumpylog](https://github.com/stumpylog) ([#14379](https://github.com/paperless-ngx/paperless-ngx/pull/14379)) + +
+ +## paperless-ngx 3.3.0 + +### Features / Enhancements + +- Enhancement: more control over suggestion requests [@shamoon](https://github.com/shamoon) ([#14258](https://github.com/paperless-ngx/paperless-ngx/pull/14258)) +- Chorehancement: set manifest CORS for credentials [@shamoon](https://github.com/shamoon) ([#14307](https://github.com/paperless-ngx/paperless-ngx/pull/14307)) +- Enhancement: include Django admin with 2FA [@shamoon](https://github.com/shamoon) ([#14270](https://github.com/paperless-ngx/paperless-ngx/pull/14270)) +- Feature: propagate resolved secrets to interactive container shells [@stumpylog](https://github.com/stumpylog) ([#14254](https://github.com/paperless-ngx/paperless-ngx/pull/14254)) +- Enhancement: support separate embedding API key [@furkanural](https://github.com/furkanural) ([#14067](https://github.com/paperless-ngx/paperless-ngx/pull/14067)) +- Enhancement: support passthrough extra params for LLMs [@shamoon](https://github.com/shamoon) ([#14202](https://github.com/paperless-ngx/paperless-ngx/pull/14202)) +- Feature: store barcode contents, list and search them [@jurassicparkicecream](https://github.com/jurassicparkicecream) ([#14276](https://github.com/paperless-ngx/paperless-ngx/pull/14276)) + +### Bug Fixes + +- Fix: Set the ProcessedMail owner based on the rule owner in all cases [@stumpylog](https://github.com/stumpylog) ([#14356](https://github.com/paperless-ngx/paperless-ngx/pull/14356)) +- Fix: Ensure log rotation settings are converted to integers [@stumpylog](https://github.com/stumpylog) ([#14343](https://github.com/paperless-ngx/paperless-ngx/pull/14343)) +- Fix: Wrap apt calls into a retry so we can ideally jump a slow mirror [@stumpylog](https://github.com/stumpylog) ([#14344](https://github.com/paperless-ngx/paperless-ngx/pull/14344)) +- Fix: ship pdf.js CMaps so CJK documents render in the viewer [@MrOggy85](https://github.com/MrOggy85) ([#14318](https://github.com/paperless-ngx/paperless-ngx/pull/14318)) +- Fix: use version page\_count for versioned document [@shamoon](https://github.com/shamoon) ([#14280](https://github.com/paperless-ngx/paperless-ngx/pull/14280)) +- Fix: allow pointer events for pdf links in pngx viewer [@shamoon](https://github.com/shamoon) ([#14264](https://github.com/paperless-ngx/paperless-ngx/pull/14264)) +- Fix: During a move to the trash directory, only attempt to copy metadata [@stumpylog](https://github.com/stumpylog) ([#14250](https://github.com/paperless-ngx/paperless-ngx/pull/14250)) +- Fix: convert file mtime to the configured time zone directly [@stumpylog](https://github.com/stumpylog) ([#14249](https://github.com/paperless-ngx/paperless-ngx/pull/14249)) +- Fix: ensure documentDeleted subscription is discarded [@shamoon](https://github.com/shamoon) ([#14247](https://github.com/paperless-ngx/paperless-ngx/pull/14247)) +- Chore: Fix bugs in the test suite [@stumpylog](https://github.com/stumpylog) ([#14244](https://github.com/paperless-ngx/paperless-ngx/pull/14244)) +- Fix: ensure bulk operations are checked against version root [@shamoon](https://github.com/shamoon) ([#14246](https://github.com/paperless-ngx/paperless-ngx/pull/14246)) +- Fix: indexing after document-added workflows signal [@shamoon](https://github.com/shamoon) ([#14242](https://github.com/paperless-ngx/paperless-ngx/pull/14242)) +- Fix: Record full tag and custom field lists in bulk edit audit log [@stumpylog](https://github.com/stumpylog) ([#14236](https://github.com/paperless-ngx/paperless-ngx/pull/14236)) +- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235)) +- Fix: handle legacy bulk edit split page range with missing page\_count [@shamoon](https://github.com/shamoon) ([#14212](https://github.com/paperless-ngx/paperless-ngx/pull/14212)) +- Fix: ignore invalid EXIF orientation when generating image archives [@zhzy0077](https://github.com/zhzy0077) ([#14203](https://github.com/paperless-ngx/paperless-ngx/pull/14203)) + +### Documentation + +- Documentation: correct duplicates info [@shamoon](https://github.com/shamoon) ([#14243](https://github.com/paperless-ngx/paperless-ngx/pull/14243)) + +### Maintenance + +- Chore(deps): Bump the actions group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14332](https://github.com/paperless-ngx/paperless-ngx/pull/14332)) +- Fix: Wrap apt calls into a retry so we can ideally jump a slow mirror [@stumpylog](https://github.com/stumpylog) ([#14344](https://github.com/paperless-ngx/paperless-ngx/pull/14344)) +- Chore(deps): Bump the actions group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14301](https://github.com/paperless-ngx/paperless-ngx/pull/14301)) + +### Dependencies + +
+27 changes + +- Chore(deps): Bump django-filter from 25.2 to 26.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14337](https://github.com/paperless-ngx/paperless-ngx/pull/14337)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14338](https://github.com/paperless-ngx/paperless-ngx/pull/14338)) +- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14351](https://github.com/paperless-ngx/paperless-ngx/pull/14351)) +- Chore(deps-dev): Bump types-channels from 4.3.0.20260408 to 4.3.0.20260518 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14335](https://github.com/paperless-ngx/paperless-ngx/pull/14335)) +- docker(deps): Bump astral-sh/uv from 0.12.20-python3.14-trixie-slim to 0.12.23-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#14327](https://github.com/paperless-ngx/paperless-ngx/pull/14327)) +- Chore(deps): Bump the actions group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14332](https://github.com/paperless-ngx/paperless-ngx/pull/14332)) +- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14325](https://github.com/paperless-ngx/paperless-ngx/pull/14325)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14329](https://github.com/paperless-ngx/paperless-ngx/pull/14329)) +- Chore(deps-dev): Bump prettier from 3.9.8 to 3.9.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14331](https://github.com/paperless-ngx/paperless-ngx/pull/14331)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14330](https://github.com/paperless-ngx/paperless-ngx/pull/14330)) +- Chore(deps-dev): Bump zensical from 0.0.64 to 0.0.65 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#14326](https://github.com/paperless-ngx/paperless-ngx/pull/14326)) +- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14314](https://github.com/paperless-ngx/paperless-ngx/pull/14314)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14305](https://github.com/paperless-ngx/paperless-ngx/pull/14305)) +- docker-compose(deps): bump greenmail/standalone from 2.1.13 to 2.1.14 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#14281](https://github.com/paperless-ngx/paperless-ngx/pull/14281)) +- docker(deps): Bump astral-sh/uv from 0.12.16-python3.14-trixie-slim to 0.12.20-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#14282](https://github.com/paperless-ngx/paperless-ngx/pull/14282)) +- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14283](https://github.com/paperless-ngx/paperless-ngx/pull/14283)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14297](https://github.com/paperless-ngx/paperless-ngx/pull/14297)) +- Chore(deps): Bump the actions group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14301](https://github.com/paperless-ngx/paperless-ngx/pull/14301)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14286](https://github.com/paperless-ngx/paperless-ngx/pull/14286)) +- Chore(deps-dev): Bump eslint from 10.10.0 to 10.11.0 in /src-ui in the frontend-eslint-dependencies group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14287](https://github.com/paperless-ngx/paperless-ngx/pull/14287)) +- Chore(deps-dev): Bump @types/node from 26.5.0 to 26.6.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14288](https://github.com/paperless-ngx/paperless-ngx/pull/14288)) +- Chore(deps-dev): Bump prettier from 3.9.6 to 3.9.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14289](https://github.com/paperless-ngx/paperless-ngx/pull/14289)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14285](https://github.com/paperless-ngx/paperless-ngx/pull/14285)) +- Chore: replace bleach with turbohtml [@gaborbernat](https://github.com/gaborbernat) ([#14269](https://github.com/paperless-ngx/paperless-ngx/pull/14269)) +- Chore(deps): Bump autobahn from 25.12.2 to 26.7.1 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14231](https://github.com/paperless-ngx/paperless-ngx/pull/14231)) +- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235)) +- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14133](https://github.com/paperless-ngx/paperless-ngx/pull/14133)) + +
+ +### All App Changes + +
+41 changes + +- Feature: store barcode contents, list and search them [@jurassicparkicecream](https://github.com/jurassicparkicecream) ([#14276](https://github.com/paperless-ngx/paperless-ngx/pull/14276)) +- Fix: Set the ProcessedMail owner based on the rule owner in all cases [@stumpylog](https://github.com/stumpylog) ([#14356](https://github.com/paperless-ngx/paperless-ngx/pull/14356)) +- Chore(deps): Bump django-filter from 25.2 to 26.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14337](https://github.com/paperless-ngx/paperless-ngx/pull/14337)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14338](https://github.com/paperless-ngx/paperless-ngx/pull/14338)) +- Chore(deps-dev): Bump types-channels from 4.3.0.20260408 to 4.3.0.20260518 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14335](https://github.com/paperless-ngx/paperless-ngx/pull/14335)) +- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14325](https://github.com/paperless-ngx/paperless-ngx/pull/14325)) +- Fix: Ensure log rotation settings are converted to integers [@stumpylog](https://github.com/stumpylog) ([#14343](https://github.com/paperless-ngx/paperless-ngx/pull/14343)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14329](https://github.com/paperless-ngx/paperless-ngx/pull/14329)) +- Chore(deps-dev): Bump prettier from 3.9.8 to 3.9.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14331](https://github.com/paperless-ngx/paperless-ngx/pull/14331)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14330](https://github.com/paperless-ngx/paperless-ngx/pull/14330)) +- Fix: ship pdf.js CMaps so CJK documents render in the viewer [@MrOggy85](https://github.com/MrOggy85) ([#14318](https://github.com/paperless-ngx/paperless-ngx/pull/14318)) +- Chore(deps-dev): Bump zensical from 0.0.64 to 0.0.65 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#14326](https://github.com/paperless-ngx/paperless-ngx/pull/14326)) +- Enhancement: more control over suggestion requests [@shamoon](https://github.com/shamoon) ([#14258](https://github.com/paperless-ngx/paperless-ngx/pull/14258)) +- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14314](https://github.com/paperless-ngx/paperless-ngx/pull/14314)) +- Chore: anchor admin url pattern [@shamoon](https://github.com/shamoon) ([#14316](https://github.com/paperless-ngx/paperless-ngx/pull/14316)) +- Chorehancement: set manifest CORS for credentials [@shamoon](https://github.com/shamoon) ([#14307](https://github.com/paperless-ngx/paperless-ngx/pull/14307)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14305](https://github.com/paperless-ngx/paperless-ngx/pull/14305)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14297](https://github.com/paperless-ngx/paperless-ngx/pull/14297)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14286](https://github.com/paperless-ngx/paperless-ngx/pull/14286)) +- Chore(deps-dev): Bump eslint from 10.10.0 to 10.11.0 in /src-ui in the frontend-eslint-dependencies group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14287](https://github.com/paperless-ngx/paperless-ngx/pull/14287)) +- Chore(deps-dev): Bump @types/node from 26.5.0 to 26.6.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14288](https://github.com/paperless-ngx/paperless-ngx/pull/14288)) +- Chore(deps-dev): Bump prettier from 3.9.6 to 3.9.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14289](https://github.com/paperless-ngx/paperless-ngx/pull/14289)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14285](https://github.com/paperless-ngx/paperless-ngx/pull/14285)) +- Fix: use version page\_count for versioned document [@shamoon](https://github.com/shamoon) ([#14280](https://github.com/paperless-ngx/paperless-ngx/pull/14280)) +- Chore: replace bleach with turbohtml [@gaborbernat](https://github.com/gaborbernat) ([#14269](https://github.com/paperless-ngx/paperless-ngx/pull/14269)) +- Enhancement: include Django admin with 2FA [@shamoon](https://github.com/shamoon) ([#14270](https://github.com/paperless-ngx/paperless-ngx/pull/14270)) +- Fix: allow pointer events for pdf links in pngx viewer [@shamoon](https://github.com/shamoon) ([#14264](https://github.com/paperless-ngx/paperless-ngx/pull/14264)) +- Feature: propagate resolved secrets to interactive container shells [@stumpylog](https://github.com/stumpylog) ([#14254](https://github.com/paperless-ngx/paperless-ngx/pull/14254)) +- Fix: During a move to the trash directory, only attempt to copy metadata [@stumpylog](https://github.com/stumpylog) ([#14250](https://github.com/paperless-ngx/paperless-ngx/pull/14250)) +- Fix: convert file mtime to the configured time zone directly [@stumpylog](https://github.com/stumpylog) ([#14249](https://github.com/paperless-ngx/paperless-ngx/pull/14249)) +- Fix: ensure documentDeleted subscription is discarded [@shamoon](https://github.com/shamoon) ([#14247](https://github.com/paperless-ngx/paperless-ngx/pull/14247)) +- Chore: Fix bugs in the test suite [@stumpylog](https://github.com/stumpylog) ([#14244](https://github.com/paperless-ngx/paperless-ngx/pull/14244)) +- Fix: ensure bulk operations are checked against version root [@shamoon](https://github.com/shamoon) ([#14246](https://github.com/paperless-ngx/paperless-ngx/pull/14246)) +- Enhancement: support separate embedding API key [@furkanural](https://github.com/furkanural) ([#14067](https://github.com/paperless-ngx/paperless-ngx/pull/14067)) +- Enhancement: support passthrough extra params for LLMs [@shamoon](https://github.com/shamoon) ([#14202](https://github.com/paperless-ngx/paperless-ngx/pull/14202)) +- Chore(deps): Bump autobahn from 25.12.2 to 26.7.1 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14231](https://github.com/paperless-ngx/paperless-ngx/pull/14231)) +- Fix: indexing after document-added workflows signal [@shamoon](https://github.com/shamoon) ([#14242](https://github.com/paperless-ngx/paperless-ngx/pull/14242)) +- Fix: Record full tag and custom field lists in bulk edit audit log [@stumpylog](https://github.com/stumpylog) ([#14236](https://github.com/paperless-ngx/paperless-ngx/pull/14236)) +- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235)) +- Fix: handle legacy bulk edit split page range with missing page\_count [@shamoon](https://github.com/shamoon) ([#14212](https://github.com/paperless-ngx/paperless-ngx/pull/14212)) +- Fix: ignore invalid EXIF orientation when generating image archives [@zhzy0077](https://github.com/zhzy0077) ([#14203](https://github.com/paperless-ngx/paperless-ngx/pull/14203)) + +
+ +## paperless-ngx 3.2.1 + +### Bug Fixes + +- Fix: only pass --conf to flower when flowerconfig.py exists [@bitfoo1](https://github.com/bitfoo1) ([#14182](https://github.com/paperless-ngx/paperless-ngx/pull/14182)) +- Fix: replace stale mail-fetch overlap check with a self-expiring lock [@stumpylog](https://github.com/stumpylog) ([#14189](https://github.com/paperless-ngx/paperless-ngx/pull/14189)) +- Fix: bump ocrmypdf to 17.12 to pick up the ligature text-layer fix [@stumpylog](https://github.com/stumpylog) ([#14190](https://github.com/paperless-ngx/paperless-ngx/pull/14190)) +- Fix: rebuild the search index automatically when it is missing Tantivy files [@stumpylog](https://github.com/stumpylog) ([#14180](https://github.com/paperless-ngx/paperless-ngx/pull/14180)) + +### Dependencies + +- Chore(deps): Bump anyio from 4.12.1 to 4.14.2 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14175](https://github.com/paperless-ngx/paperless-ngx/pull/14175)) + +### All App Changes + +
+4 changes + +- Chore(deps): Bump anyio from 4.12.1 to 4.14.2 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14175](https://github.com/paperless-ngx/paperless-ngx/pull/14175)) +- Fix: replace stale mail-fetch overlap check with a self-expiring lock [@stumpylog](https://github.com/stumpylog) ([#14189](https://github.com/paperless-ngx/paperless-ngx/pull/14189)) +- Fix: bump ocrmypdf to 17.12 to pick up the ligature text-layer fix [@stumpylog](https://github.com/stumpylog) ([#14190](https://github.com/paperless-ngx/paperless-ngx/pull/14190)) +- Fix: rebuild the search index automatically when it is missing Tantivy files [@stumpylog](https://github.com/stumpylog) ([#14180](https://github.com/paperless-ngx/paperless-ngx/pull/14180)) + +
+ +## paperless-ngx 3.2.0 + +### Features / Enhancements + +- Enhancement (QoL): support deselecting single items from "select all" [@shamoon](https://github.com/shamoon) ([#14117](https://github.com/paperless-ngx/paperless-ngx/pull/14117)) +- Enhancement: Match fuzzy terms in place inside the parsed query [@stumpylog](https://github.com/stumpylog) ([#14157](https://github.com/paperless-ngx/paperless-ngx/pull/14157)) +- Enhancement: Match CJK terms through their bigram fields in place [@stumpylog](https://github.com/stumpylog) ([#14156](https://github.com/paperless-ngx/paperless-ngx/pull/14156)) +- Enhancement: centralized management of share links + bundles [@shamoon](https://github.com/shamoon) ([#14115](https://github.com/paperless-ngx/paperless-ngx/pull/14115)) +- Enhancement: parse advanced search with whoosh-compat and delete the handwritten translation [@stumpylog](https://github.com/stumpylog) ([#14072](https://github.com/paperless-ngx/paperless-ngx/pull/14072)) +- Enhancement: allow regex timeout configuration [@shamoon](https://github.com/shamoon) ([#14085](https://github.com/paperless-ngx/paperless-ngx/pull/14085)) +- Enhancement: hide-able sidebar items [@shamoon](https://github.com/shamoon) ([#14052](https://github.com/paperless-ngx/paperless-ngx/pull/14052)) +- Enhancement: Improve matching for correspondents, storage path and labels by removing bias + adding minimum match threshold [@dewey](https://github.com/dewey) ([#12164](https://github.com/paperless-ngx/paperless-ngx/pull/12164)) +- Enhancement: add Tantivy full-text fallback adapter for taxonomy candidates [@stumpylog](https://github.com/stumpylog) ([#13820](https://github.com/paperless-ngx/paperless-ngx/pull/13820)) +- Enhancement (QoL): surface externally-set options in Config UI [@shamoon](https://github.com/shamoon) ([#13989](https://github.com/paperless-ngx/paperless-ngx/pull/13989)) +- Enhancement: allow disabling auto-suggestions for inbox documents [@shamoon](https://github.com/shamoon) ([#13946](https://github.com/paperless-ngx/paperless-ngx/pull/13946)) +- Change: skip documents with empty content in apply AI suggestions WF [@shamoon](https://github.com/shamoon) ([#13985](https://github.com/paperless-ngx/paperless-ngx/pull/13985)) +- Enhancement: duplicates filter [@shamoon](https://github.com/shamoon) ([#13994](https://github.com/paperless-ngx/paperless-ngx/pull/13994)) +- Tweak: note that apply AI suggestions runs async in WF editor [@shamoon](https://github.com/shamoon) ([#14004](https://github.com/paperless-ngx/paperless-ngx/pull/14004)) +- Enhancement (QoL): attempt to localize firstDayOfWeek for date picker [@shamoon](https://github.com/shamoon) ([#13999](https://github.com/paperless-ngx/paperless-ngx/pull/13999)) + +### Bug Fixes + +- Fix: don't redirect to signup on first install when regular login is disabled [@cyberb](https://github.com/cyberb) ([#14165](https://github.com/paperless-ngx/paperless-ngx/pull/14165)) +- Fix: better catch email workflow placeholder parsing errors [@shamoon](https://github.com/shamoon) ([#14129](https://github.com/paperless-ngx/paperless-ngx/pull/14129)) +- Fix: validate legacy bulk edit owner, rotate and split parameters [@stumpylog](https://github.com/stumpylog) ([#14120](https://github.com/paperless-ngx/paperless-ngx/pull/14120)) +- Fix: validate set\_permissions with a nested serializer [@stumpylog](https://github.com/stumpylog) ([#14119](https://github.com/paperless-ngx/paperless-ngx/pull/14119)) +- Fix: Use prefetching to reduce query counts during classifier training [@stumpylog](https://github.com/stumpylog) ([#14122](https://github.com/paperless-ngx/paperless-ngx/pull/14122)) +- Fix: reject non-dict user\_args/barcode\_tag\_mapping in config API [@stumpylog](https://github.com/stumpylog) ([#14118](https://github.com/paperless-ngx/paperless-ngx/pull/14118)) +- Fix: type edit\_pdf operations via a nested serializer [@stumpylog](https://github.com/stumpylog) ([#14116](https://github.com/paperless-ngx/paperless-ngx/pull/14116)) +- Fix: ensure django setup is run for management comments under 3.14 [@shamoon](https://github.com/shamoon) ([#14100](https://github.com/paperless-ngx/paperless-ngx/pull/14100)) +- Fix: validate PDF output doc indexes in bulk edit [@shamoon](https://github.com/shamoon) ([#14083](https://github.com/paperless-ngx/paperless-ngx/pull/14083)) +- Fix: avoid IntegrityError when a retried task republishes with the same ID [@stumpylog](https://github.com/stumpylog) ([#14096](https://github.com/paperless-ngx/paperless-ngx/pull/14096)) +- Fix: update some api global perms inconsistencies [@shamoon](https://github.com/shamoon) ([#14086](https://github.com/paperless-ngx/paperless-ngx/pull/14086)) +- Fix: ignore nested action IDs on WF create [@shamoon](https://github.com/shamoon) ([#14084](https://github.com/paperless-ngx/paperless-ngx/pull/14084)) +- Fix: correct text/stream compression workaround [@shamoon](https://github.com/shamoon) ([#14064](https://github.com/paperless-ngx/paperless-ngx/pull/14064)) +- Fix: ui version content switching inconsistencies [@shamoon](https://github.com/shamoon) ([#14066](https://github.com/paperless-ngx/paperless-ngx/pull/14066)) +- Fix: prevent saving changes to stale cached document object [@shamoon](https://github.com/shamoon) ([#14065](https://github.com/paperless-ngx/paperless-ngx/pull/14065)) +- Fix: ensure remove inbox tag children on remove\_inbox\_tags [@shamoon](https://github.com/shamoon) ([#14050](https://github.com/paperless-ngx/paperless-ngx/pull/14050)) +- Fix: connect add\_to\_index handler after document\_added [@shamoon](https://github.com/shamoon) ([#14058](https://github.com/paperless-ngx/paperless-ngx/pull/14058)) +- Fix: Drop empty files from tracking after the stability window has passed [@stumpylog](https://github.com/stumpylog) ([#14047](https://github.com/paperless-ngx/paperless-ngx/pull/14047)) +- Fixhancement: better LLM errors [@shamoon](https://github.com/shamoon) ([#14031](https://github.com/paperless-ngx/paperless-ngx/pull/14031)) +- Fix: prevent orphaned versions from bulk delete [@shamoon](https://github.com/shamoon) ([#14030](https://github.com/paperless-ngx/paperless-ngx/pull/14030)) +- Fixhancement: prevent overlapping mail-account processing runs [@stumpylog](https://github.com/stumpylog) ([#14046](https://github.com/paperless-ngx/paperless-ngx/pull/14046)) +- Fix: Use PAPERLESS\_REDIS\_PREFIX for Celery result backend keys [@bdd](https://github.com/bdd) ([#14015](https://github.com/paperless-ngx/paperless-ngx/pull/14015)) +- Fix: correct setting ai\_enabled to false via UI [@shamoon](https://github.com/shamoon) ([#13987](https://github.com/paperless-ngx/paperless-ngx/pull/13987)) +- Fix: catch some frontend failed object retrievals [@shamoon](https://github.com/shamoon) ([#14023](https://github.com/paperless-ngx/paperless-ngx/pull/14023)) +- Fix: more v3 icons cleanup [@shamoon](https://github.com/shamoon) ([#14017](https://github.com/paperless-ngx/paperless-ngx/pull/14017)) +- Fix: correct add version actor parity [@shamoon](https://github.com/shamoon) ([#14016](https://github.com/paperless-ngx/paperless-ngx/pull/14016)) +- Fix: fix v3 favicon file [@shamoon](https://github.com/shamoon) ([#14014](https://github.com/paperless-ngx/paperless-ngx/pull/14014)) +- Fix: change share link bundle dialog button to close after create, don't toast on copied [@shamoon](https://github.com/shamoon) ([#14002](https://github.com/paperless-ngx/paperless-ngx/pull/14002)) +- Fix: truncate mail subjects to field max length [@shamoon](https://github.com/shamoon) ([#13991](https://github.com/paperless-ngx/paperless-ngx/pull/13991)) +- Fix: enforce the overflow hidden rule on pdf editor thumbnails [@shamoon](https://github.com/shamoon) ([#13976](https://github.com/paperless-ngx/paperless-ngx/pull/13976)) +- Fix: also correct unbroken long names on small cards [@shamoon](https://github.com/shamoon) ([#13974](https://github.com/paperless-ngx/paperless-ngx/pull/13974)) +- Fix: ensure parent + child tags change together in bulk editor [@shamoon](https://github.com/shamoon) ([#13972](https://github.com/paperless-ngx/paperless-ngx/pull/13972)) + +### Dependencies + +
+29 changes + +- Chore(deps): Bump the utilities-patch group across 1 directory with 15 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14167](https://github.com/paperless-ngx/paperless-ngx/pull/14167)) +- docker(deps): Bump astral-sh/uv from 0.12.9-python3.14-trixie-slim to 0.12.16-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#14134](https://github.com/paperless-ngx/paperless-ngx/pull/14134)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14149](https://github.com/paperless-ngx/paperless-ngx/pull/14149)) +- Chore(deps): Bump the actions group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14162](https://github.com/paperless-ngx/paperless-ngx/pull/14162)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 19 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14141](https://github.com/paperless-ngx/paperless-ngx/pull/14141)) +- docker-compose(deps): bump gotenberg/gotenberg from 8.36 to 8.37 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#14137](https://github.com/paperless-ngx/paperless-ngx/pull/14137)) +- docker-compose(deps): Bump nginx from 1.31.5-alpine to 1.31.6-alpine in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#14138](https://github.com/paperless-ngx/paperless-ngx/pull/14138)) +- Chore(deps): Bump pdfjs-dist from 6.2.108 to 6.3.289 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14144](https://github.com/paperless-ngx/paperless-ngx/pull/14144)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14143](https://github.com/paperless-ngx/paperless-ngx/pull/14143)) +- Chore(deps-dev): Bump @types/node from 26.4.0 to 26.5.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14146](https://github.com/paperless-ngx/paperless-ngx/pull/14146)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14142](https://github.com/paperless-ngx/paperless-ngx/pull/14142)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 11 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13988](https://github.com/paperless-ngx/paperless-ngx/pull/13988)) +- Chore(deps): Bump sentence-transformers from 5.6.1 to 6.0.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13983](https://github.com/paperless-ngx/paperless-ngx/pull/13983)) +- Chore(deps-dev): Bump types-markdown from 3.10.2.20260518 to 3.10.2.20260712 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13982](https://github.com/paperless-ngx/paperless-ngx/pull/13982)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13980](https://github.com/paperless-ngx/paperless-ngx/pull/13980)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.7.0 to >=2.7,\<2.9 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13984](https://github.com/paperless-ngx/paperless-ngx/pull/13984)) +- Chore: Updates our direct Redis pin [@stumpylog](https://github.com/stumpylog) ([#13986](https://github.com/paperless-ngx/paperless-ngx/pull/13986)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13918](https://github.com/paperless-ngx/paperless-ngx/pull/13918)) +- Chore(deps): Bump uuid from 14.0.1 to 14.0.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#13921](https://github.com/paperless-ngx/paperless-ngx/pull/13921)) +- Chore(deps-dev): Bump @types/node from 26.2.0 to 26.4.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#13919](https://github.com/paperless-ngx/paperless-ngx/pull/13919)) +- Chore: update ng-select to v24, handle breaking changes [@shamoon](https://github.com/shamoon) ([#13951](https://github.com/paperless-ngx/paperless-ngx/pull/13951)) +- Chore(deps): Bump djangorestframework from 3.17.2 to 3.18.0 in the django-ecosystem group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13912](https://github.com/paperless-ngx/paperless-ngx/pull/13912)) +- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13922](https://github.com/paperless-ngx/paperless-ngx/pull/13922)) +- Chore(deps): Bump the document-processing group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13916](https://github.com/paperless-ngx/paperless-ngx/pull/13916)) +- Chore(deps): Bump flower from 2.0.1 to 2.1.0 in the async-tasks group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13913](https://github.com/paperless-ngx/paperless-ngx/pull/13913)) +- Chore(deps): Bump the actions group across 1 directory with 15 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13920](https://github.com/paperless-ngx/paperless-ngx/pull/13920)) +- docker-compose(deps): Bump gotenberg/gotenberg from 8.34 to 8.36 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#13910](https://github.com/paperless-ngx/paperless-ngx/pull/13910)) +- Chore(deps-dev): Bump the development group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13911](https://github.com/paperless-ngx/paperless-ngx/pull/13911)) +- docker(deps): Bump astral-sh/uv from 0.12.5-python3.14-trixie-slim to 0.12.9-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#13914](https://github.com/paperless-ngx/paperless-ngx/pull/13914)) + +
+ +### All App Changes + +
+80 changes + +- Chore(deps): Bump the utilities-patch group across 1 directory with 15 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14167](https://github.com/paperless-ngx/paperless-ngx/pull/14167)) +- Fix: don't redirect to signup on first install when regular login is disabled [@cyberb](https://github.com/cyberb) ([#14165](https://github.com/paperless-ngx/paperless-ngx/pull/14165)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14149](https://github.com/paperless-ngx/paperless-ngx/pull/14149)) +- Enhancement (QoL): support deselecting single items from "select all" [@shamoon](https://github.com/shamoon) ([#14117](https://github.com/paperless-ngx/paperless-ngx/pull/14117)) +- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 19 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14141](https://github.com/paperless-ngx/paperless-ngx/pull/14141)) +- Enhancement: Match fuzzy terms in place inside the parsed query [@stumpylog](https://github.com/stumpylog) ([#14157](https://github.com/paperless-ngx/paperless-ngx/pull/14157)) +- Enhancement: Match CJK terms through their bigram fields in place [@stumpylog](https://github.com/stumpylog) ([#14156](https://github.com/paperless-ngx/paperless-ngx/pull/14156)) +- Chore(deps): Bump pdfjs-dist from 6.2.108 to 6.3.289 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14144](https://github.com/paperless-ngx/paperless-ngx/pull/14144)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14143](https://github.com/paperless-ngx/paperless-ngx/pull/14143)) +- Chore(deps-dev): Bump @types/node from 26.4.0 to 26.5.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14146](https://github.com/paperless-ngx/paperless-ngx/pull/14146)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14142](https://github.com/paperless-ngx/paperless-ngx/pull/14142)) +- Enhancement: centralized management of share links + bundles [@shamoon](https://github.com/shamoon) ([#14115](https://github.com/paperless-ngx/paperless-ngx/pull/14115)) +- Performance: Preprocess classifier text with Tantivy instead of NLTK [@stumpylog](https://github.com/stumpylog) ([#14127](https://github.com/paperless-ngx/paperless-ngx/pull/14127)) +- Performance: Drops fields from the classifier before pickling [@stumpylog](https://github.com/stumpylog) ([#14114](https://github.com/paperless-ngx/paperless-ngx/pull/14114)) +- Fix: better catch email workflow placeholder parsing errors [@shamoon](https://github.com/shamoon) ([#14129](https://github.com/paperless-ngx/paperless-ngx/pull/14129)) +- Performance: Improves the memory efficiency of classifier training [@stumpylog](https://github.com/stumpylog) ([#14124](https://github.com/paperless-ngx/paperless-ngx/pull/14124)) +- Performance: Streams the classifier pickle file during save as well [@stumpylog](https://github.com/stumpylog) ([#14121](https://github.com/paperless-ngx/paperless-ngx/pull/14121)) +- Fix: validate legacy bulk edit owner, rotate and split parameters [@stumpylog](https://github.com/stumpylog) ([#14120](https://github.com/paperless-ngx/paperless-ngx/pull/14120)) +- Fix: validate set\_permissions with a nested serializer [@stumpylog](https://github.com/stumpylog) ([#14119](https://github.com/paperless-ngx/paperless-ngx/pull/14119)) +- Fix: Use prefetching to reduce query counts during classifier training [@stumpylog](https://github.com/stumpylog) ([#14122](https://github.com/paperless-ngx/paperless-ngx/pull/14122)) +- Fix: reject non-dict user\_args/barcode\_tag\_mapping in config API [@stumpylog](https://github.com/stumpylog) ([#14118](https://github.com/paperless-ngx/paperless-ngx/pull/14118)) +- Fix: type edit\_pdf operations via a nested serializer [@stumpylog](https://github.com/stumpylog) ([#14116](https://github.com/paperless-ngx/paperless-ngx/pull/14116)) +- Performance: Loads the classifier through a memory view to reduce memory usage [@stumpylog](https://github.com/stumpylog) ([#14113](https://github.com/paperless-ngx/paperless-ngx/pull/14113)) +- Feature: parse advanced search with whoosh-compat and delete the handwritten translation [@stumpylog](https://github.com/stumpylog) ([#14072](https://github.com/paperless-ngx/paperless-ngx/pull/14072)) +- Fix: ensure django setup is run for management comments under 3.14 [@shamoon](https://github.com/shamoon) ([#14100](https://github.com/paperless-ngx/paperless-ngx/pull/14100)) +- Fix: validate PDF output doc indexes in bulk edit [@shamoon](https://github.com/shamoon) ([#14083](https://github.com/paperless-ngx/paperless-ngx/pull/14083)) +- Enhancement: allow regex timeout configuration [@shamoon](https://github.com/shamoon) ([#14085](https://github.com/paperless-ngx/paperless-ngx/pull/14085)) +- Fix: avoid IntegrityError when a retried task republishes with the same ID [@stumpylog](https://github.com/stumpylog) ([#14096](https://github.com/paperless-ngx/paperless-ngx/pull/14096)) +- Chore: include Apply AI Suggestions in the tasks UI filter dropdown [@shamoon](https://github.com/shamoon) ([#14093](https://github.com/paperless-ngx/paperless-ngx/pull/14093)) +- Fix: update some api global perms inconsistencies [@shamoon](https://github.com/shamoon) ([#14086](https://github.com/paperless-ngx/paperless-ngx/pull/14086)) +- Fix: ignore nested action IDs on WF create [@shamoon](https://github.com/shamoon) ([#14084](https://github.com/paperless-ngx/paperless-ngx/pull/14084)) +- Fix: correct text/stream compression workaround [@shamoon](https://github.com/shamoon) ([#14064](https://github.com/paperless-ngx/paperless-ngx/pull/14064)) +- Fix: ui version content switching inconsistencies [@shamoon](https://github.com/shamoon) ([#14066](https://github.com/paperless-ngx/paperless-ngx/pull/14066)) +- Fix: prevent saving changes to stale cached document object [@shamoon](https://github.com/shamoon) ([#14065](https://github.com/paperless-ngx/paperless-ngx/pull/14065)) +- Performance: batch permission assignment in bulk `set_permissions` [@stumpylog](https://github.com/stumpylog) ([#13806](https://github.com/paperless-ngx/paperless-ngx/pull/13806)) +- Performance: skip effective\_content annotation on document list unless required [@stumpylog](https://github.com/stumpylog) ([#13789](https://github.com/paperless-ngx/paperless-ngx/pull/13789)) +- Fix: ensure remove inbox tag children on remove\_inbox\_tags [@shamoon](https://github.com/shamoon) ([#14050](https://github.com/paperless-ngx/paperless-ngx/pull/14050)) +- Fix: connect add\_to\_index handler after document\_added [@shamoon](https://github.com/shamoon) ([#14058](https://github.com/paperless-ngx/paperless-ngx/pull/14058)) +- Enhancement: hide-able sidebar items [@shamoon](https://github.com/shamoon) ([#14052](https://github.com/paperless-ngx/paperless-ngx/pull/14052)) +- Performance: cut redundant per-document lookups in bulk `modify_custom_fields` [@stumpylog](https://github.com/stumpylog) ([#13807](https://github.com/paperless-ngx/paperless-ngx/pull/13807)) +- Enhancement: Improve matching for correspondents, storage path and labels by removing bias + adding minimum match threshold [@dewey](https://github.com/dewey) ([#12164](https://github.com/paperless-ngx/paperless-ngx/pull/12164)) +- Fix: Drop empty files from tracking after the stability window has passed [@stumpylog](https://github.com/stumpylog) ([#14047](https://github.com/paperless-ngx/paperless-ngx/pull/14047)) +- Fixhancement: better LLM errors [@shamoon](https://github.com/shamoon) ([#14031](https://github.com/paperless-ngx/paperless-ngx/pull/14031)) +- Fix: prevent orphaned versions from bulk delete [@shamoon](https://github.com/shamoon) ([#14030](https://github.com/paperless-ngx/paperless-ngx/pull/14030)) +- Enhancement: add Tantivy full-text fallback adapter for taxonomy candidates [@stumpylog](https://github.com/stumpylog) ([#13820](https://github.com/paperless-ngx/paperless-ngx/pull/13820)) +- Fixhancement: prevent overlapping mail-account processing runs [@stumpylog](https://github.com/stumpylog) ([#14046](https://github.com/paperless-ngx/paperless-ngx/pull/14046)) +- Performance: ensure version-aware content filters on querysets [@shamoon](https://github.com/shamoon) ([#13792](https://github.com/paperless-ngx/paperless-ngx/pull/13792)) +- Performance: skip nested TagSerializer construction when a tag has no children [@stumpylog](https://github.com/stumpylog) ([#14039](https://github.com/paperless-ngx/paperless-ngx/pull/14039)) +- Enhancement (QoL): surface externally-set options in Config UI [@shamoon](https://github.com/shamoon) ([#13989](https://github.com/paperless-ngx/paperless-ngx/pull/13989)) +- Enhancement: allow disabling auto-suggestions for inbox documents [@shamoon](https://github.com/shamoon) ([#13946](https://github.com/paperless-ngx/paperless-ngx/pull/13946)) +- Change: skip documents with empty content in apply AI suggestions WF [@shamoon](https://github.com/shamoon) ([#13985](https://github.com/paperless-ngx/paperless-ngx/pull/13985)) +- Performance: resolve index-write permissions and effective content in bulk [@stumpylog](https://github.com/stumpylog) ([#13869](https://github.com/paperless-ngx/paperless-ngx/pull/13869)) +- Fix: Use PAPERLESS\_REDIS\_PREFIX for Celery result backend keys [@bdd](https://github.com/bdd) ([#14015](https://github.com/paperless-ngx/paperless-ngx/pull/14015)) +- Enhancement: duplicates filter [@shamoon](https://github.com/shamoon) ([#13994](https://github.com/paperless-ngx/paperless-ngx/pull/13994)) +- Fix: correct setting ai\_enabled to false via UI [@shamoon](https://github.com/shamoon) ([#13987](https://github.com/paperless-ngx/paperless-ngx/pull/13987)) +- Chore(deps): Bump the utilities-minor group across 1 directory with 11 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13988](https://github.com/paperless-ngx/paperless-ngx/pull/13988)) +- Fix: catch some frontend failed object retrievals [@shamoon](https://github.com/shamoon) ([#14023](https://github.com/paperless-ngx/paperless-ngx/pull/14023)) +- Fix: more v3 icons cleanup [@shamoon](https://github.com/shamoon) ([#14017](https://github.com/paperless-ngx/paperless-ngx/pull/14017)) +- Fix: correct add version actor parity [@shamoon](https://github.com/shamoon) ([#14016](https://github.com/paperless-ngx/paperless-ngx/pull/14016)) +- Fix: fix v3 favicon file [@shamoon](https://github.com/shamoon) ([#14014](https://github.com/paperless-ngx/paperless-ngx/pull/14014)) +- Tweak: note that apply AI suggestions runs async in WF editor [@shamoon](https://github.com/shamoon) ([#14004](https://github.com/paperless-ngx/paperless-ngx/pull/14004)) +- Fix: change share link bundle dialog button to close after create, don't toast on copied [@shamoon](https://github.com/shamoon) ([#14002](https://github.com/paperless-ngx/paperless-ngx/pull/14002)) +- Enhancement (QoL): attempt to localize firstDayOfWeek for date picker [@shamoon](https://github.com/shamoon) ([#13999](https://github.com/paperless-ngx/paperless-ngx/pull/13999)) +- Fix: truncate mail subjects to field max length [@shamoon](https://github.com/shamoon) ([#13991](https://github.com/paperless-ngx/paperless-ngx/pull/13991)) +- Chore(deps): Bump sentence-transformers from 5.6.1 to 6.0.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13983](https://github.com/paperless-ngx/paperless-ngx/pull/13983)) +- Chore(deps-dev): Bump types-markdown from 3.10.2.20260518 to 3.10.2.20260712 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13982](https://github.com/paperless-ngx/paperless-ngx/pull/13982)) +- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13980](https://github.com/paperless-ngx/paperless-ngx/pull/13980)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.7.0 to >=2.7,\<2.9 @[dependabot[bot]](https://github.com/apps/dependabot) ([#13984](https://github.com/paperless-ngx/paperless-ngx/pull/13984)) +- Chore: Updates our direct Redis pin [@stumpylog](https://github.com/stumpylog) ([#13986](https://github.com/paperless-ngx/paperless-ngx/pull/13986)) +- Fix: enforce the overflow hidden rule on pdf editor thumbnails [@shamoon](https://github.com/shamoon) ([#13976](https://github.com/paperless-ngx/paperless-ngx/pull/13976)) +- Fix: also correct unbroken long names on small cards [@shamoon](https://github.com/shamoon) ([#13974](https://github.com/paperless-ngx/paperless-ngx/pull/13974)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13918](https://github.com/paperless-ngx/paperless-ngx/pull/13918)) +- Chore(deps): Bump uuid from 14.0.1 to 14.0.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#13921](https://github.com/paperless-ngx/paperless-ngx/pull/13921)) +- Chore(deps-dev): Bump @types/node from 26.2.0 to 26.4.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#13919](https://github.com/paperless-ngx/paperless-ngx/pull/13919)) +- Chore: update ng-select to v24, handle breaking changes [@shamoon](https://github.com/shamoon) ([#13951](https://github.com/paperless-ngx/paperless-ngx/pull/13951)) +- Chore(deps): Bump djangorestframework from 3.17.2 to 3.18.0 in the django-ecosystem group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13912](https://github.com/paperless-ngx/paperless-ngx/pull/13912)) +- Chore(deps): Bump the document-processing group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13916](https://github.com/paperless-ngx/paperless-ngx/pull/13916)) +- Chore(deps): Bump flower from 2.0.1 to 2.1.0 in the async-tasks group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13913](https://github.com/paperless-ngx/paperless-ngx/pull/13913)) +- Chore(deps-dev): Bump the development group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13911](https://github.com/paperless-ngx/paperless-ngx/pull/13911)) +- Fix: ensure parent + child tags change together in bulk editor [@shamoon](https://github.com/shamoon) ([#13972](https://github.com/paperless-ngx/paperless-ngx/pull/13972)) + +
+ ## paperless-ngx 3.1.3 ### Bug Fixes diff --git a/docs/configuration.md b/docs/configuration.md index 37a552f1a..3257a815c 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -413,18 +413,12 @@ details. Defaults to `PAPERLESS_DATA_DIR/log/`. -#### [`PAPERLESS_NLTK_DIR=`](#PAPERLESS_NLTK_DIR) {#PAPERLESS_NLTK_DIR} +#### ~~[`PAPERLESS_NLTK_DIR`](#PAPERLESS_NLTK_DIR)~~ {#PAPERLESS_NLTK_DIR} -: This is where paperless will search for the data required for NLTK -processing, if you are using it. If you are using the Docker image, -this should not be changed, as the data is included in the image -already. +!!! failure "Removed in v3.2" -Previously, the location defaulted to `PAPERLESS_DATA_DIR/nltk`. -Unless you are using this in a bare metal install or other setup, -this folder is no longer needed and can be removed manually. - -Defaults to `/usr/share/nltk_data` + Removed and ignored. Any previously downloaded NLTK data folder can be + deleted. #### [`PAPERLESS_MODEL_FILE=`](#PAPERLESS_MODEL_FILE) {#PAPERLESS_MODEL_FILE} @@ -1190,15 +1184,31 @@ for details on how to set it. Defaults to UTC. -#### [`PAPERLESS_ENABLE_NLTK=`](#PAPERLESS_ENABLE_NLTK) {#PAPERLESS_ENABLE_NLTK} +#### ~~[`PAPERLESS_ENABLE_NLTK`](#PAPERLESS_ENABLE_NLTK)~~ {#PAPERLESS_ENABLE_NLTK} -: Enables or disables the advanced natural language processing -used during automatic classification. If disabled, paperless will -still perform some basic text pre-processing before matching. +!!! failure "Removed in v3.2" -: See also `PAPERLESS_NLTK_DIR`. + Removed and ignored. Automatic classification always removes stop words + and stems words when the primary OCR language is Danish, Dutch, English, + Finnish, French, German, Italian, Norwegian, Portuguese, Russian, Spanish + or Swedish. Other languages are only lowercased and split into words. - Defaults to true, enabling the feature. +#### [`PAPERLESS_CLASSIFIER_MATCH_THRESHOLD=`](#PAPERLESS_CLASSIFIER_MATCH_THRESHOLD) {#PAPERLESS_CLASSIFIER_MATCH_THRESHOLD} + +: Sets the minimum confidence score (0.0-1.0) required for the automatic +classifier to assign a correspondent, document type, or storage path to a +document. Predictions below this threshold are discarded and the field is +left unassigned, preventing low-confidence guesses from being applied. + + Defaults to 0.3. + +#### [`PAPERLESS_MATCH_REGEX_TIMEOUT_SECONDS=`](#PAPERLESS_MATCH_REGEX_TIMEOUT_SECONDS) {#PAPERLESS_MATCH_REGEX_TIMEOUT_SECONDS} + +: Sets the timeout, in seconds, for regular expression matching. Increase this +value if date parsing or user-defined matching rules time out when processing +long documents, especially on slower hardware. + + Defaults to 0.1 seconds. #### [`PAPERLESS_DATE_PARSER_LANGUAGES=`](#PAPERLESS_DATE_PARSER_LANGUAGES) {#PAPERLESS_DATE_PARSER_LANGUAGES} @@ -1269,6 +1279,8 @@ Tantivy stemmer equivalent, stemming is disabled. matching. Fuzzy results rank below exact matches. A value of `0.5` is a reasonable starting point. Leave unset to disable fuzzy matching entirely. + Words of a single character are not fuzzy-matched, since a single-character approximate match would match nearly every term in the index. + Defaults to unset (disabled). #### [`PAPERLESS_SANITY_TASK_CRON=`](#PAPERLESS_SANITY_TASK_CRON) {#PAPERLESS_SANITY_TASK_CRON} @@ -1784,6 +1796,13 @@ assigns or creates tags if a properly formatted barcode is detected. Defaults to false. +#### [`PAPERLESS_CONSUMER_STORE_BARCODE_VALUES=`](#PAPERLESS_CONSUMER_STORE_BARCODE_VALUES) {#PAPERLESS_CONSUMER_STORE_BARCODE_VALUES} + +: Stores the content of every barcode found during consumption, see +[Barcode Contents](advanced_usage.md#barcode-contents). + + Defaults to false. + ## Audit Trail #### [`PAPERLESS_AUDIT_LOG_ENABLED=`](#PAPERLESS_AUDIT_LOG_ENABLED) {#PAPERLESS_AUDIT_LOG_ENABLED} @@ -2121,6 +2140,13 @@ for language and resource considerations. Defaults to None. +#### [`PAPERLESS_AI_LLM_EMBEDDING_API_KEY=`](#PAPERLESS_AI_LLM_EMBEDDING_API_KEY) {#PAPERLESS_AI_LLM_EMBEDDING_API_KEY} + +: The API key to use for the embedding backend. If not supplied, embeddings use +`PAPERLESS_AI_LLM_API_KEY`. + + Defaults to None. + #### [`PAPERLESS_AI_LLM_EMBEDDING_ENDPOINT=`](#PAPERLESS_AI_LLM_EMBEDDING_ENDPOINT) {#PAPERLESS_AI_LLM_EMBEDDING_ENDPOINT} : The endpoint / url to use for the embedding backend. If not supplied, embeddings use @@ -2205,6 +2231,19 @@ used with the OpenAI-compatible backend to target a custom provider or local gat Defaults to true, which allows internal endpoints. +#### [`PAPERLESS_AI_LLM_EXTRA_PARAMS=`](#PAPERLESS_AI_LLM_EXTRA_PARAMS) {#PAPERLESS_AI_LLM_EXTRA_PARAMS} + +: A JSON object of extra parameters sent with every LLM request, for providers that require a parameter Paperless does not +set itself. Values here override Paperless' own, and no validation is performed. Whatever you put here is passed to the +backend as-is, so an invalid parameter will simply be rejected by your provider. For example, current OpenAI reasoning +models refuse tool calls on the chat completions API unless reasoning is off: + + ``` + PAPERLESS_AI_LLM_EXTRA_PARAMS={"reasoning_effort": "none"} + ``` + + Defaults to empty, which adds nothing to requests. + #### [`PAPERLESS_LLM_INDEX_TASK_CRON=`](#PAPERLESS_LLM_INDEX_TASK_CRON) {#PAPERLESS_LLM_INDEX_TASK_CRON} : Configures the schedule to update the AI embeddings of text content and metadata for all documents. Only performed if diff --git a/docs/development.md b/docs/development.md index d4c44ce89..bfab008f6 100644 --- a/docs/development.md +++ b/docs/development.md @@ -150,6 +150,7 @@ pnpm ng build --configuration production is loaded as well. However, the tests rely on the default configuration. This is not ideal. But for now, make sure no settings except for DEBUG are overridden when testing. +- Tests run in a random order each session, so that one test cannot quietly depend on another having run first. The seed is printed at the top of the run; pass `--randomly-seed=` to replay that exact order, or `--randomly-seed=last` to repeat the previous run. !!! note diff --git a/docs/faq.md b/docs/faq.md index a5ec3c154..0cd64bbee 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -76,7 +76,9 @@ is not supported by any of the available parsers. **A:** Not by default. As of v3, a file whose contents match an existing document is still consumed, and the duplicate is flagged in the UI — open the document and check the -**Duplicates** tab to review documents that share the same content. If you prefer the old +**Duplicates** tab to review documents that share the same content, or filter the document +list by **Duplicates** to find all of them (see +[Duplicate documents](usage.md#duplicate-documents)). If you prefer the old behavior of rejecting duplicates during consumption, set [`PAPERLESS_CONSUMER_DELETE_DUPLICATES`](configuration.md#PAPERLESS_CONSUMER_DELETE_DUPLICATES) to `true`. diff --git a/docs/index.md b/docs/index.md index f2dcb3cfc..f7200d10f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,10 +12,10 @@ physical documents into a searchable online archive so you can keep, well, _less [Get started](setup.md){ .md-button .md-button--primary .index-callout } [Demo](https://demo.paperless-ngx.com){ .md-button .md-button--secondary target=\_blank } -
- - - + diff --git a/docs/setup.md b/docs/setup.md index 528d0abc5..e666cb58d 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -430,11 +430,6 @@ to a positive number to enable polling and disable native filesystem notificatio This will reduce the size of generated PDF documents. You'll most likely need to compile this yourself, because this software has been patented until around 2017 and binary packages are not available for most distributions. -**Optional: download the NLTK data** -If using the NLTK machine-learning processing (see [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) for details), -download the NLTK data for the Snowball Stemmer, Stopwords and Punkt tokenizer to `/usr/share/nltk_data`. Refer to the [NLTK -instructions](https://www.nltk.org/data.html) for details on how to download the data. - #### After installation Your Paperless-ngx instance should now be accessible at `http://localhost:8000` (or similar, depending on your configuration). @@ -650,9 +645,6 @@ hardware, but a few settings can improve performance: `PAPERLESS_OCR_CLEAN=none`. This will speed up OCR times and use less memory at the expense of slightly worse OCR results. - If using Docker, consider setting [`PAPERLESS_WEBSERVER_WORKERS`](configuration.md#PAPERLESS_WEBSERVER_WORKERS) to 1. This will save some memory. -- Consider setting [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) to false, to disable the - more advanced language processing, which can take more memory and - processing time. For details, refer to [configuration](configuration.md). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index b372bea90..ba2498e29 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -129,7 +129,7 @@ change in the `docker-compose.yml` file: command: - 'gotenberg' - '--chromium-disable-javascript=true' - - '--chromium-allow-list=file:///tmp/.*' + - '--chromium-allow-list=^file:///tmp/.*' - '--api-timeout=60s' ``` @@ -272,6 +272,65 @@ This error can occur in installations which have upgraded from a version of Pape $ python3 manage.py convert_mariadb_uuid ``` +## MariaDB/MySQL error "Illegal mix of collations" + +Consumption or other operations fail with an error like: + +``` +(1267, "Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and +(utf8mb4_unicode_ci,IMPLICIT) for operation '='") +``` + +This happens when the tables in your database do not all use the same +collation. It is most often seen on databases that existed before a +MariaDB/MySQL upgrade: older tables keep their original collation, while +tables created afterwards use the new server default. + +To work around it, set the collation your existing tables use (the one in the error +that is not `utf8mb4_unicode_ci`) with +[`PAPERLESS_DB_OPTIONS`](configuration.md#PAPERLESS_DB_OPTIONS): + +```bash +PAPERLESS_DB_OPTIONS="collation=utf8mb4_general_ci" +``` + +To fix it permanently, back up your database, then convert the database and +each table to a single collation and remove the override: + +```sql +ALTER DATABASE paperless CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +``` + +## PostgreSQL warns about a "collation version mismatch" + +The PostgreSQL log shows a warning like: + +``` +WARNING: database "paperless" has a collation version mismatch +DETAIL: The database was created using collation version 2.36, but the operating system provides version 2.41. +HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE paperless REFRESH COLLATION VERSION, or build PostgreSQL with the right library version. +``` + +This comes from PostgreSQL, not Paperless-ngx. The `glibc` version that PostgreSQL +runs against changed, and the existing database was created with an older one. With +Docker, `glibc` comes from the PostgreSQL image's Debian base, not the host, so this +commonly happens when a new image is pulled after its base Debian release changed. +If PostgreSQL is installed directly on a host, it uses the host's `glibc` instead. + +The warning is not an error and Paperless-ngx keeps working, but the database's text +indexes may be built with outdated sorting rules. To resolve it, back up your +database, then connect to it (for example with `psql -U paperless -d paperless` +inside the database container) and run: + +```sql +REINDEX DATABASE paperless; +ALTER DATABASE paperless REFRESH COLLATION VERSION; +``` + +To avoid this in the future, pin your PostgreSQL image to a specific Debian release, +for example `postgres:18-trixie`, rather than `postgres:18`. + ## Platform-Specific Deployment Troubleshooting A user-maintained wiki page is available to help troubleshoot issues that may arise when trying to deploy Paperless-ngx on specific platforms, for example SELinux. Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Platform%E2%80%90Specific-Troubleshooting). diff --git a/docs/usage.md b/docs/usage.md index 6bee3c9c3..20803f2a6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -299,19 +299,18 @@ for details. ### Duplicate documents By default, Paperless-ngx **does not reject duplicates**. If you consume a file whose -contents exactly match an existing document (same checksum), the new copy is still -consumed and a warning is logged. The task entry for the upload also flags that a -duplicate was detected and links to the existing document(s). +contents match an existing document (same original or archive checksum), the new copy is +still consumed and a warning is logged. -To review duplicates, open a document and switch to the **Duplicates** tab on the -document detail page. It lists other documents that share the same content, including any -that are in the trash (shown with a badge), and links to each so you can decide which to -keep. +When a document has duplicates, a **Duplicates** tab appears on its detail page, listing +the other documents you can view that share the same content (including any in the trash). +To find all documents with duplicates, choose **Duplicates** in the document list's text +filter dropdown, or use `has_duplicates=true` in the REST API. If you would rather reject duplicates at consumption time (the pre-v3 behavior), set [`PAPERLESS_CONSUMER_DELETE_DUPLICATES`](configuration.md#PAPERLESS_CONSUMER_DELETE_DUPLICATES) to `true`. The duplicate file is then deleted instead of consumed, and the task fails with -a "document already exists" message. +a "Document already exists" message linking to the existing document. ## Document Suggestions @@ -927,52 +926,105 @@ typed in the search bar. A few things to know about how matching works: Paperless also offers advanced search syntax if you want to drill down further. -Matching documents with logical expressions: +#### Combining terms ``` shopname AND (product1 OR product2) +invoice NOT draft +"quick brown fox" ``` -Matching specific tags, correspondents or types: +- `AND`, `OR` and `NOT` must be written in capitals. Parentheses group terms. +- Terms with no operator between them are combined with `AND`. +- Quotes match an exact phrase, with the words in that order. + +!!! warning + + A leading `-` does **not** exclude a term. `invoice -secret` finds documents containing both words. Use `invoice NOT secret` instead. + +#### Searching by field + +Put a field name and a colon in front of a value to search only that field: ``` type:invoice tag:unpaid -correspondent:university certificate +correspondent:"acme corp" +tag:bills,unpaid +asn:[50 to 150] +checksum:9f86d081* ``` -Matching dates: +| Field | Searches | +| ------------------------- | ---------------------------------------- | +| `title` | Title | +| `content` | Text content | +| `correspondent` | Correspondent | +| `document_type` or `type` | Document type | +| `storage_path` or `path` | Storage path | +| `tag` | Tags | +| `original_filename` | File name the document was consumed with | +| `asn` | Archive serial number | +| `page_count` | Number of pages | +| `num_notes` | Number of notes | +| `checksum` | Checksum of the original file | +| `created` | Created date | +| `added` | When the document was added to paperless | +| `modified` | When the document was last modified | + +- A field applies only to the word right after it. Quote multi-word values: `correspondent:"acme corp"`. +- A comma-separated `tag` list requires every listed tag, so `tag:bills,unpaid` only matches documents tagged with both. +- `asn`, `page_count` and `num_notes` are numbers. They accept ranges like `asn:[50 to 150]`, but not wildcards. +- `checksum` only matches the complete checksum, in lowercase. To search by its first few characters, add a wildcard: `checksum:9f86d081*`. +- `created`, `added` and `modified` take the values described in [Searching by date](#searching-by-date). +- Custom fields and notes have their own syntax, described [below](#searching-custom-fields). + +#### Wildcards + +``` +invoice* +title:Invoice* +20[12]? +20[!0]? +``` + +- `*` matches any number of characters, and `?` matches exactly one. +- `[...]` matches one character from a set or range, and `[!...]` matches one character not in it. `20[12]?` matches 2010 to 2029. +- Brackets only act as a wildcard when the value also contains a `*` or `?`. Otherwise they are searched as ordinary text. The exception is a single-character range such as `title:200[1-9]`, which is rejected with an error. Add a wildcard to use it as a pattern: `title:200[1-9]*`. + +!!! note + + When a [stemmer is available](configuration.md#PAPERLESS_SEARCH_LANGUAGE) for your search language, words are indexed by their stem, so `copy*` also finds "copies". A prefix that runs past the stem can find nothing: `universit*` misses "university", which is stored as `univers`. If a wildcard finds nothing, try a shorter prefix, such as `univers*`. + +#### Searching by date ``` -created:[2005 to 2009] added:yesterday -modified:today +modified:"previous month" +created:[2005 to 2009] +added:[-1 week to now] ``` -Matching inexact words: +These keywords each cover a whole period, and work with or without quotes: `today`, `yesterday`, `tomorrow`, `previous week`, `this month`, `previous month`, `previous quarter`, `this year`, `previous year`. -``` -produ*name -``` +Other supported forms: -Matching natural date keywords: +| Example | Matches | Quotes | +| ------------------------------------------------------- | ------------------------------ | -------- | +| `created:2005`, `created:2005-01`, `created:2005-03-04` | That year, month or day | Optional | +| `added:january` | That month in the current year | Optional | +| `added:"next monday"`, `added:"last monday"` | That day | Required | +| `added:"12 december 2019"` | That day | Required | +| `added:"2005-01-01T00:00:00Z"` | That exact time | Required | -``` -added:today -modified:yesterday -created:"previous week" -added:"previous month" -modified:"this year" -``` +Ranges take two bounds in square brackets, for example `created:[2005 to 2009]`. A bound can be any of the forms above, or a relative time like `-1 week`, `now-7d` or `now`. Bounds don't need quotes. If you do quote one, use single quotes (`added:['-1 week' to now]`), because double quotes are rejected. -Supported date keywords: `today`, `yesterday`, `previous week`, -`this month`, `previous month`, `this year`, `previous year`, -`previous quarter`. +!!! warning + + `now`, `noon`, `midnight` and relative times like `-1 week` only work as range bounds. On their own they mean a single instant, so `added:"-1 week"` finds nothing. Use `added:[-1 week to now]` instead. A bare weekday (`monday`) and spellings like `3 days ago` or `this week` are not supported at all. #### Searching custom fields -Custom field names and values are included in the full-text index, but they -are not searched by a plain, unqualified query. Use the advanced search syntax -to search by field name or value: +Custom field names and values are included in the full-text index, but a plain search without a field name does not look at them. Use the advanced search syntax to search by field name or value: ``` custom_fields.value:policy @@ -983,10 +1035,9 @@ custom_fields.name:Insurance custom_fields.value:policy - `custom_fields.value` matches against the value of any custom field. - `custom_fields.name` matches the name of the field (use quotes for multi-word names). - Combine both to find documents where a specific named field contains a specific value. +- The bare `custom_fields:` prefix is shorthand for `custom_fields.value:`. -Because separators are stripped during indexing, individual parts of formatted -codes are searchable on their own. A value stored as `A-1312/99.50` produces the -tokens `a`, `1312`, `99`, `50` — each searchable independently: +Because separators are stripped during indexing, each part of a formatted code can be searched on its own. A value stored as `A-1312/99.50` is indexed as `a`, `1312`, `99` and `50`: ``` custom_fields.value:1312 @@ -995,14 +1046,11 @@ custom_fields.name:"Contract Number" custom_fields.value:1312 !!! note - Custom date fields do not support relative date syntax (e.g. `[now to 2 weeks]`). - For date ranges on custom date fields, use the document list filters in the web UI. + Custom date fields do not support relative date syntax such as `[now to 2 weeks]`. For date ranges on custom date fields, use the document list filters in the web UI. #### Searching notes -Notes are included in the full-text index, but they are not searched by a -plain, unqualified query. Use the advanced search syntax to search by note -author or content: +Notes are included in the full-text index, but a plain search without a field name does not look at them. Use the advanced search syntax to search by note author or content: ``` notes.user:alice @@ -1010,15 +1058,27 @@ notes.note:reminder notes.user:alice notes.note:insurance ``` -All of these constructs can be combined as you see fit. If you want to -learn more about the query language used by paperless, see the -[Tantivy query language documentation](https://docs.rs/tantivy/latest/tantivy/query/struct.QueryParser.html). +The bare `notes:` prefix is shorthand for `notes.note:`. + +#### Searching barcodes + +If [barcode contents are stored](advanced_usage.md#barcode-contents), they can be searched by +content or type, but only with a field name: + +``` +barcodes.value:DE89370400440532013000 +barcodes.format:qrcode +barcodes:wifi barcodes:guest +``` + +`barcodes:` is shorthand for `barcodes.value:`. Separators are stripped, so each part of e.g. +`WIFI:S:Guest;P:secret;;` can be searched on its own. + +All of these can be combined. Syntax not described here may not work as expected, and an unknown field name is searched as ordinary text. !!! note - Fuzzy (approximate) matching can be enabled by setting - [`PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD`](configuration.md#PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD). - When enabled, paperless will include near-miss results ranked below exact matches. + Fuzzy (approximate) matching can be enabled by setting [`PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD`](configuration.md#PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD). When enabled, paperless also includes near-miss results, ranked below exact matches. ## Keyboard shortcuts / hotkeys diff --git a/pyproject.toml b/pyproject.toml index 199d3f2cf..fbd4593d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,9 @@ [project] name = "paperless-ngx" -version = "3.1.3" -description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" +version = "3.3.3" +description = """\ + A community-supported supercharged document management system: scan, index and archive all your physical documents\ + """ readme = "README.md" requires-python = ">=3.11" classifiers = [ @@ -10,13 +12,13 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", ] # TODO: Move certain things to groups and then utilize that further # This will allow testing to not install a webserver, mysql, etc dependencies = [ "azure-ai-documentintelligence>=1.0.2", "babel>=2.17", - "bleach~=6.4.0", "celery[redis]~=5.6.2", "channels~=4.2", "channels-redis~=4.2", @@ -31,18 +33,18 @@ dependencies = [ "django-compression-middleware~=0.5.0", "django-cors-headers~=4.9.0", "django-extensions~=4.1", - "django-filter~=25.1", - "django-guardian>=3.3.3,<3.5", + "django-filter>=25.1,<27", + "django-guardian>=3.3.3,<3.6", "django-multiselectfield~=1.0.1", "django-rich~=2.2.0", "django-soft-delete~=1.0.18", "django-treenode>=0.24", "djangorestframework~=3.16", "drf-spectacular~=0.30", - "drf-spectacular-sidecar>=2026.7.1,<2026.9", + "drf-spectacular-sidecar>=2026.7.1,<2026.10", "drf-writable-nested~=0.7.1", - "filelock~=3.32.0", - "flower>=2.0.1,<2.2", + "filelock>=3.32,<4.1", + "flower>=2.0.1,<2.3", "gotenberg-client[httpx]~=1.0", "httpx-oauth~=0.17", "ijson>=3.5.1", @@ -55,8 +57,7 @@ dependencies = [ "llama-index-embeddings-openai-like>=0.2.2", "llama-index-llms-ollama>=0.9.1", "llama-index-llms-openai-like>=0.7.1", - "nltk~=3.10.0", - "ocrmypdf>=17.7,<17.12", + "ocrmypdf[heic]>=17.12,<17.13", "openai>=2.48", "pathvalidate~=3.3.1", "pdf2image~=1.17.0", @@ -74,20 +75,22 @@ dependencies = [ "sqlite-vec==0.1.9", "tantivy~=0.26.0", "tika-client[httpx]~=1.0", - "torch~=2.13.0", + "torch>=2.13,<2.15", + "turbohtml~=1.10.0", "watchfiles>=1.2", "whitenoise~=6.11", + "whoosh-compat[tantivy]==0.3", "zxing-cpp~=3.1.0", ] [project.optional-dependencies] mariadb = [ - "mysqlclient~=2.2.7", + "mysqlclient>=2.2.7,<2.4", ] postgres = [ "psycopg[c,pool]==3.3.4", # Direct dependency for proper resolution of the pre-built wheels "psycopg-c==3.3.4", - "psycopg-pool==3.3.1", + "psycopg-pool==3.3.3", ] webserver = [ "granian[uvloop]>=2.7,<2.9", @@ -109,7 +112,7 @@ lint = [ testing = [ "daphne", "factory-boy~=3.3.1", - "faker>=40.36,<40.38", + "faker>=40.36,<40.40", "imagehash", "pytest~=9.1.1", "pytest-cov~=7.1.0", @@ -117,7 +120,7 @@ testing = [ "pytest-env~=1.7.0", "pytest-httpx", "pytest-mock~=3.15.1", - # "pytest-randomly~=4.0.1", + "pytest-randomly~=5.0.0", "pytest-rerunfailures~=16.4", "pytest-sugar", "pytest-xdist~=3.8.0", @@ -133,7 +136,6 @@ typing = [ "mypy", "mypy-baseline", "pyrefly", - "types-bleach", "types-channels", "types-colorama", "types-dateparser", @@ -148,6 +150,7 @@ typing = [ [tool.uv] required-version = ">=0.9.0" +prerelease = "disallow" environments = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", @@ -244,10 +247,14 @@ per-file-ignores."docker/wait-for-redis.py" = [ per-file-ignores."src/documents/models.py" = [ "SIM115", ] +per-file-ignores."src/documents/tests/*.py" = [ + "TID251", +] +flake8-tidy-imports.banned-api."documents.tests".msg = "Shared test infrastructure lives in src/paperless_testing/." isort.force-single-line = true [tool.codespell] -ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober,commitish,NIN,nin" +ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober,commitish,NIN,nin,reprot" skip = """\ src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/paperless/tests/samples\ /mail/*,src/documents/tests/samples/*,*.po,*.json\ @@ -271,9 +278,9 @@ plugins = [ ] [tool.pyrefly] -baseline = ".pyrefly-baseline.json" python-platform = "linux" search-path = [ "src" ] +baseline = ".pyrefly-baseline.json" [tool.django-stubs] django_settings_module = "paperless.settings" @@ -326,6 +333,8 @@ PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer" # I don't think anything hits this, but just in case, basically infinite PAPERLESS_TOKEN_THROTTLE_RATE = "1000/min" +# The 0.1s production default trips on a stalled CI runner, the date parsing tests then find no dates +PAPERLESS_MATCH_REGEX_TIMEOUT_SECONDS = "5" [tool.coverage.run] source = [ @@ -334,13 +343,15 @@ source = [ omit = [ "*/tests/*", "manage.py", - "paperless/wsgi.py", "paperless/auth.py", + "paperless/wsgi.py", + "src/conftest.py", + "src/paperless_testing/*", ] [tool.coverage.report] exclude_also = [ - "if settings.AUDIT_LOG_ENABLED:", "if AUDIT_LOG_ENABLED:", + "if settings.AUDIT_LOG_ENABLED:", "if TYPE_CHECKING:", ] diff --git a/scripts/start_services.sh b/scripts/start_services.sh index 4fe7273ac..b59f918d6 100755 --- a/scripts/start_services.sh +++ b/scripts/start_services.sh @@ -2,5 +2,5 @@ docker run -p 5432:5432 -e POSTGRES_PASSWORD=password -v paperless_pgdata:/var/lib/postgresql/data -d postgres:15 docker run -d -p 6379:6379 redis:latest -docker run -p 3000:3000 -d gotenberg/gotenberg:7.8 gotenberg --chromium-disable-javascript=true --chromium-allow-list="file:///tmp/.*" +docker run -p 3000:3000 -d gotenberg/gotenberg:7.8 gotenberg --chromium-disable-javascript=true --chromium-allow-list="^file:///tmp/.*" docker run -p 9998:9998 -d docker.io/apache/tika:latest diff --git a/src-ui/angular.json b/src-ui/angular.json index c3801947d..633be88c5 100644 --- a/src-ui/angular.json +++ b/src-ui/angular.json @@ -91,6 +91,11 @@ "glob": "**/*", "input": "node_modules/pdfjs-dist/iccs/", "output": "/assets/iccs/" + }, + { + "glob": "**/*", + "input": "node_modules/pdfjs-dist/cmaps/", + "output": "/assets/cmaps/" } ], "styles": [ diff --git a/src-ui/jest.config.js b/src-ui/jest.config.js index f3557702a..89a334130 100644 --- a/src-ui/jest.config.js +++ b/src-ui/jest.config.js @@ -15,6 +15,8 @@ module.exports = { tsconfig: '/tsconfig.spec.json', stringifyContentPathRegex: '\\.(html|svg)$', useESM: true, + // Disable the builder's deprecated override; tsconfig.spec.json enables isolation. + isolatedModules: false, }, ], }, @@ -26,7 +28,7 @@ module.exports = { 'abstract-paperless-service', ], transformIgnorePatterns: [ - 'node_modules/(?!.*(\\.mjs$|tslib|lodash-es|normalize-diacritics|@angular/common/locales/.*\\.js$))', + 'node_modules/(?!.*(\\.mjs$|tslib|lodash-es|normalize-diacritics|marked|@angular/common/locales/.*\\.js$))', ], moduleNameMapper: { ...esmPreset.moduleNameMapper, diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index c85af9c32..251a6951c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -5,302 +5,299 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/alert/alert.ts - 39 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/alert/alert.ts + 38,39 - Slide of + Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/carousel/carousel.ts - 129 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/carousel/carousel.ts + 386,393 Currently selected slide number read by screen reader Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/carousel/carousel.ts - 147,148 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/carousel/carousel.ts + 425,426 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/carousel/carousel.ts - 187 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/carousel/carousel.ts + 452,453 Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation-select.ts - 89 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation-select.ts + 52 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation-select.ts - 89 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation-select.ts + 52 Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation-select.ts - 89 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation-select.ts + 52 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation-select.ts - 89 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation-select.ts + 52 Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation.ts - 74,76 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation.ts + 73,76 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation.ts - 103 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation.ts + 73,76 Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation.ts - 103 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation.ts + 73,74 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/datepicker/datepicker-navigation.ts - 103 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/datepicker/datepicker-navigation.ts + 73,74 «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 297 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 322 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 358 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277 »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 396 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277 First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 414,415 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 444,445 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 479,480 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/pagination/pagination.ts - 506 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/pagination/pagination.ts + 277,278 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/progressbar/progressbar.ts - 40 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/progressbar/progressbar.ts + 39,40 HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 256,259 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 293,295 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 322 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 360 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 397,399 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts - 435,438 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts + 442 Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/timepicker/timepicker.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/timepicker/timepicker.ts 442 Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.1.3_@angular+core@22.1.3_@angular+_6e980a1a1b6a042b5112673ade17a76b/node_modules/src/toast/toast.ts - 110,112 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.0_@angular+core@22.2.0_@angular+_c552d1ba15a99af2612c08752b8c9e9c/node_modules/src/toast/toast.ts + 80 Document was added to Paperless-ngx. src/app/app.component.ts - 93 - - - src/app/app.component.ts - 102 + 78 Open document src/app/app.component.ts - 95 + 82 src/app/components/admin/trash/trash.component.ts - 147 + 154 + + + src/app/components/common/upload-status-tray/upload-status-tray.component.html + 44,45 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 63 + 65 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 66 + 68 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 69 - - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html - 58,59 + 71 Could not add : src/app/app.component.ts - 117 - - - - Document is being processed by Paperless-ngx. - - src/app/app.component.ts - 132 + 96 Dashboard src/app/app.component.ts - 139 + 108 + + + src/app/components/admin/settings/settings.component.ts + 112 src/app/components/app-frame/app-frame.component.html - 91 + 106 src/app/components/app-frame/app-frame.component.html - 93 + 108 + + + src/app/components/app-frame/app-frame.component.html + 111 src/app/components/dashboard/dashboard.component.html @@ -311,32 +308,28 @@ Documents src/app/app.component.ts - 150 + 119 src/app/components/admin/settings/settings.component.html - 195,196 + 211,212 src/app/components/admin/settings/settings.component.html - 199,200 + 215,216 src/app/components/app-frame/app-frame.component.html - 100 + 118 src/app/components/app-frame/app-frame.component.html - 102 + 120 src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html 87,88 - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 36,37 - src/app/components/document-list/document-list.component.ts 214 @@ -347,26 +340,30 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 151 + 153 src/app/components/manage/document-attributes/management-list/management-list.component.html - 151 + 153 src/app/components/manage/document-attributes/management-list/management-list.component.html - 151 + 153 src/app/components/manage/document-attributes/management-list/management-list.component.html - 151 + 153 + + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 20,21 Settings src/app/app.component.ts - 162 + 131 src/app/components/admin/settings/settings.component.html @@ -374,64 +371,64 @@ src/app/components/app-frame/app-frame.component.html - 58 + 70 src/app/components/app-frame/app-frame.component.html - 282 + 321 src/app/components/app-frame/app-frame.component.html - 284 + 323 The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. src/app/app.component.ts - 171 + 140 Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. src/app/app.component.ts - 178 + 147 The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. src/app/app.component.ts - 183 + 152 The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. src/app/app.component.ts - 190 + 159 Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. src/app/app.component.ts - 196 + 165 Attributes like tags, correspondents, document types, storage paths and custom fields can all be managed here. They can also be created from the document edit view. src/app/app.component.ts - 201 + 170 Manage e-mail accounts and rules for automatically importing documents. src/app/app.component.ts - 209 + 178 src/app/components/manage/mail/mail.component.html @@ -442,42 +439,42 @@ Workflows give you more control over the document pipeline. src/app/app.component.ts - 217 + 186 Tasks helps you track background work, what needs attention, and what recently completed. src/app/app.component.ts - 225 + 194 Check out the settings for various tweaks to the web app. src/app/app.component.ts - 233 + 202 Thank you! 🙏 src/app/app.component.ts - 241 + 210 There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. src/app/app.component.ts - 243 + 212 Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! src/app/app.component.ts - 245 + 214 @@ -541,7 +538,7 @@ src/app/components/admin/settings/settings.component.html - 138 + 154 @@ -563,7 +560,7 @@ src/app/components/admin/settings/settings.component.html - 407,408 + 439,440 src/app/components/common/confirm-dialog/confirm-dialog.component.ts @@ -642,7 +639,7 @@ src/app/components/admin/settings/settings.component.html - 408,409 + 440,441 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -690,7 +687,7 @@ src/app/components/document-detail/document-detail.component.html - 453,454 + 441,442 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -755,11 +752,11 @@ src/app/components/app-frame/app-frame.component.html - 319 + 358 src/app/components/app-frame/app-frame.component.html - 321 + 360 @@ -862,7 +859,7 @@ src/app/components/document-detail/document-detail.component.html - 472 + 460 src/app/components/document-list/document-list.component.html @@ -874,19 +871,19 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 52 + 54 src/app/components/manage/document-attributes/management-list/management-list.component.html - 52 + 54 src/app/components/manage/document-attributes/management-list/management-list.component.html - 52 + 54 src/app/components/manage/document-attributes/management-list/management-list.component.html - 52 + 54 src/app/components/manage/mail/mail.component.html @@ -1029,46 +1026,53 @@ 113 + + Sidebar items to show: + + src/app/components/admin/settings/settings.component.html + 115,116 + + Dark mode src/app/components/admin/settings/settings.component.html - 120,121 + 136,137 Use system settings src/app/components/admin/settings/settings.component.html - 123 + 139 Enable dark mode src/app/components/admin/settings/settings.component.html - 124 + 140 Invert thumbnails in dark mode src/app/components/admin/settings/settings.component.html - 125 + 141 Theme Color src/app/components/admin/settings/settings.component.html - 131,132 + 147,148 Global search src/app/components/admin/settings/settings.component.html - 144,145 + 160,161 src/app/components/app-frame/global-search/global-search.component.ts @@ -1079,28 +1083,28 @@ Do not include advanced search results src/app/components/admin/settings/settings.component.html - 147 + 163 Full search links to src/app/components/admin/settings/settings.component.html - 153,154 + 169,170 Title and content search src/app/components/admin/settings/settings.component.html - 157,158 + 173,174 Advanced search src/app/components/admin/settings/settings.component.html - 158,159 + 174,175 src/app/components/app-frame/global-search/global-search.component.html @@ -1108,28 +1112,28 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 210 + 211 Update checking src/app/components/admin/settings/settings.component.html - 163,164 + 179,180 Enable update checking src/app/components/admin/settings/settings.component.html - 166 + 182 What's this? src/app/components/admin/settings/settings.component.html - 167 + 183 src/app/components/common/page-header/page-header.component.html @@ -1148,29 +1152,37 @@ Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. src/app/components/admin/settings/settings.component.html - 172 + 188 No tracking data is collected by the app in any way. src/app/components/admin/settings/settings.component.html - 175,176 + 191,192 Saved Views src/app/components/admin/settings/settings.component.html - 181,182 + 197,198 + + + src/app/components/admin/settings/settings.component.ts + 113 src/app/components/app-frame/app-frame.component.html - 242 + 260 src/app/components/app-frame/app-frame.component.html - 244 + 262 + + + src/app/components/app-frame/app-frame.component.html + 265 src/app/components/manage/saved-views/saved-views.component.html @@ -1181,162 +1193,190 @@ Show warning when closing saved views with unsaved changes src/app/components/admin/settings/settings.component.html - 184 + 200 Show document counts in sidebar saved views src/app/components/admin/settings/settings.component.html - 185 + 201 Items per page src/app/components/admin/settings/settings.component.html - 202,203 + 218,219 Document editing src/app/components/admin/settings/settings.component.html - 214,215 + 230,231 Use PDF viewer provided by the browser src/app/components/admin/settings/settings.component.html - 217 + 233 This is usually faster for displaying large PDF documents, but it might not work on some browsers. src/app/components/admin/settings/settings.component.html - 217 + 233 Default zoom src/app/components/admin/settings/settings.component.html - 223,224 + 239,240 Fit width src/app/components/admin/settings/settings.component.html - 227,228 + 243,244 Fit page src/app/components/admin/settings/settings.component.html - 228,229 + 244,245 Only applies to the Paperless-ngx PDF viewer. src/app/components/admin/settings/settings.component.html - 230,231 + 246,247 Automatically remove inbox tag(s) on save src/app/components/admin/settings/settings.component.html - 236 + 252 + + + + Suggestions default to + + src/app/components/admin/settings/settings.component.html + 259,260 + + + + Both + + src/app/components/admin/settings/settings.component.html + 264 + + + + ML only + + src/app/components/admin/settings/settings.component.html + 266 + + + + AI only + + src/app/components/admin/settings/settings.component.html + 268 Automatically request suggestions for inbox documents src/app/components/admin/settings/settings.component.html - 242 + 276 If un-checked, suggestions must be requested via the Suggest button. src/app/components/admin/settings/settings.component.html - 242 + 276 Show document thumbnail during loading src/app/components/admin/settings/settings.component.html - 248 + 282 Built-in fields to show: src/app/components/admin/settings/settings.component.html - 254,255 + 288,289 Uncheck fields to hide them on the document details page. src/app/components/admin/settings/settings.component.html - 266,267 + 300,301 Bulk editing src/app/components/admin/settings/settings.component.html - 272,273 + 306,307 Show confirmation dialogs src/app/components/admin/settings/settings.component.html - 275 + 309 Apply on close src/app/components/admin/settings/settings.component.html - 276 + 310 PDF Editor src/app/components/admin/settings/settings.component.html - 280,281 + 314,315 src/app/components/document-detail/document-detail.component.html - 82 + 61 src/app/components/document-detail/document-detail.component.ts - 1808 + 1913 Default editing mode src/app/components/admin/settings/settings.component.html - 283,284 + 317,318 Create new document(s) src/app/components/admin/settings/settings.component.html - 287,288 + 321,322 src/app/components/common/pdf-editor/pdf-editor.component.html @@ -1347,7 +1387,7 @@ Add document version src/app/components/admin/settings/settings.component.html - 288,289 + 322,323 src/app/components/common/pdf-editor/pdf-editor.component.html @@ -1358,7 +1398,7 @@ Notes src/app/components/admin/settings/settings.component.html - 293,294 + 327,328 src/app/components/document-list/document-list.component.html @@ -1377,14 +1417,14 @@ Enable notes src/app/components/admin/settings/settings.component.html - 296 + 330 Permissions src/app/components/admin/settings/settings.component.html - 305,306 + 339,340 src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html @@ -1395,12 +1435,12 @@ 51 - src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 2,3 + src/app/components/common/input/permissions/permissions-form/permissions-form.component.ts + 63 src/app/components/document-detail/document-detail.component.html - 398,399 + 386,387 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -1439,142 +1479,142 @@ Default Permissions src/app/components/admin/settings/settings.component.html - 308,310 + 342,344 Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI. These settings do not apply to documents. src/app/components/admin/settings/settings.component.html - 313 + 347 Default Owner src/app/components/admin/settings/settings.component.html - 319,320 + 353,354 Objects without an owner can be viewed and edited by all users src/app/components/admin/settings/settings.component.html - 323,324 + 357,358 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 32,33 + 34,35 Default View Permissions src/app/components/admin/settings/settings.component.html - 328,329 + 362,363 Users: src/app/components/admin/settings/settings.component.html - 333,334 + 367,368 src/app/components/admin/settings/settings.component.html - 360,361 + 394,395 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 278,279 + 279,280 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 297,298 + 298,299 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 364,365 + 365,366 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 383,384 + 384,385 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 38,39 + 40,41 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 57,58 + 59,60 Groups: src/app/components/admin/settings/settings.component.html - 343,344 + 377,378 src/app/components/admin/settings/settings.component.html - 370,371 + 404,405 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 286,287 + 287,288 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 305,306 + 306,307 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 372,373 + 373,374 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 391,392 + 392,393 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 46,47 + 48,49 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 65,66 + 67,68 Default Edit Permissions src/app/components/admin/settings/settings.component.html - 355,356 + 389,390 Edit permissions also grant viewing permissions src/app/components/admin/settings/settings.component.html - 379,380 + 413,414 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 311,312 + 312,313 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 397,398 + 398,399 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 71,72 + 73,74 Notifications src/app/components/admin/settings/settings.component.html - 387,388 + 421,422 src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html @@ -1589,74 +1629,60 @@ Document processing src/app/components/admin/settings/settings.component.html - 390,392 + 424,426 - - Show notifications when new documents are detected + + Add notifications when document processing completes successfully src/app/components/admin/settings/settings.component.html - 394 + 428 - - Show notifications when document processing completes successfully + + These are added to the notifications menu without a popup, processing progress is shown at the bottom of the screen. src/app/components/admin/settings/settings.component.html - 395 + 428 Show notifications when document processing fails src/app/components/admin/settings/settings.component.html - 396 - - - - Suppress notifications on dashboard - - src/app/components/admin/settings/settings.component.html - 397 - - - - This will suppress all messages about document processing status on the dashboard. - - src/app/components/admin/settings/settings.component.html - 397 + 429 Use system language src/app/components/admin/settings/settings.component.ts - 80 + 86 Use date format of display language src/app/components/admin/settings/settings.component.ts - 83 + 89 Archive serial number src/app/components/admin/settings/settings.component.ts - 97 + 103 src/app/components/document-detail/document-detail.component.html - 173 + 145 Correspondent src/app/components/admin/settings/settings.component.ts - 99 + 105 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -1664,7 +1690,7 @@ src/app/components/document-detail/document-detail.component.html - 178 + 150 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -1691,7 +1717,7 @@ Document type src/app/components/admin/settings/settings.component.ts - 100 + 106 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -1699,7 +1725,7 @@ src/app/components/document-detail/document-detail.component.html - 182 + 154 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -1726,7 +1752,7 @@ Storage path src/app/components/admin/settings/settings.component.ts - 101 + 107 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -1734,7 +1760,7 @@ src/app/components/document-detail/document-detail.component.html - 186 + 158 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -1757,11 +1783,11 @@ Tags src/app/components/admin/settings/settings.component.ts - 102 + 108 src/app/components/app-frame/app-frame.component.html - 213 + 231 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -1804,11 +1830,95 @@ 84 + + Share Links + + src/app/components/admin/settings/settings.component.ts + 114 + + + src/app/components/app-frame/app-frame.component.html + 276 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 30 + + + src/app/components/document-detail/document-detail.component.html + 78,79 + + + + Workflows + + src/app/components/admin/settings/settings.component.ts + 115 + + + src/app/components/app-frame/app-frame.component.html + 284 + + + src/app/components/app-frame/app-frame.component.html + 286 + + + src/app/components/app-frame/app-frame.component.html + 289 + + + src/app/components/manage/workflows/workflows.component.html + 2,3 + + + + Mail + + src/app/components/admin/settings/settings.component.ts + 116 + + + src/app/components/app-frame/app-frame.component.html + 295 + + + src/app/components/app-frame/app-frame.component.html + 297 + + + src/app/components/app-frame/app-frame.component.html + 300 + + + + Documentation + + src/app/components/admin/settings/settings.component.ts + 117 + + + src/app/components/app-frame/app-frame.component.html + 78 + + + src/app/components/app-frame/app-frame.component.html + 366,367 + + + src/app/components/app-frame/app-frame.component.html + 369 + + + src/app/components/app-frame/app-frame.component.html + 372 + + Error retrieving users src/app/components/admin/settings/settings.component.ts - 256 + 285 src/app/components/admin/users-groups/users-groups.component.ts @@ -1827,7 +1937,7 @@ Error retrieving groups src/app/components/admin/settings/settings.component.ts - 275 + 304 src/app/components/admin/users-groups/users-groups.component.ts @@ -1846,40 +1956,40 @@ Settings were saved successfully. src/app/components/admin/settings/settings.component.ts - 599 + 649 Settings were saved successfully. Reload is required to apply some changes. src/app/components/admin/settings/settings.component.ts - 603 + 656 Reload now src/app/components/admin/settings/settings.component.ts - 604 + 657 An error occurred while saving settings. src/app/components/admin/settings/settings.component.ts - 614 + 667 src/app/components/app-frame/app-frame.component.ts - 188 + 214 src/app/components/app-frame/app-frame.component.ts - 289 + 332 src/app/components/app-frame/app-frame.component.ts - 318 + 361 @@ -1890,11 +2000,11 @@ src/app/components/app-frame/app-frame.component.html - 305 + 344 src/app/components/app-frame/app-frame.component.html - 307 + 346 @@ -1934,7 +2044,7 @@ src/app/components/admin/tasks/tasks.component.ts - 54 + 58 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html @@ -1980,7 +2090,7 @@ src/app/components/admin/tasks/tasks.component.ts - 215 + 224 @@ -1991,7 +2101,7 @@ src/app/components/admin/tasks/tasks.component.ts - 227 + 236 @@ -2027,22 +2137,40 @@ 107 + + of tasks + + src/app/components/admin/tasks/tasks.component.html + 126,127 + + + + Show all + + src/app/components/admin/tasks/tasks.component.html + 128 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 14,17 + + {VAR_PLURAL, plural, =1 {1 task} other { tasks}} src/app/components/admin/tasks/tasks.component.html - 122 + 131,132 Name src/app/components/admin/tasks/tasks.component.html - 144,145 + 153,154 src/app/components/admin/tasks/tasks.component.ts - 49 + 53 src/app/components/admin/trash/trash.component.html @@ -2118,19 +2246,19 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 38,39 + 40,41 src/app/components/manage/document-attributes/management-list/management-list.component.html - 38,39 + 40,41 src/app/components/manage/document-attributes/management-list/management-list.component.html - 38,39 + 40,41 src/app/components/manage/document-attributes/management-list/management-list.component.html - 38,39 + 40,41 src/app/components/manage/mail/mail.component.html @@ -2149,7 +2277,7 @@ Created src/app/components/admin/tasks/tasks.component.html - 145,146 + 154,155 src/app/components/common/dates-dropdown/dates-dropdown.component.html @@ -2159,14 +2287,18 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 97 - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 32,33 - src/app/components/document-list/document-list.component.html 266,267 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 16,17 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 16,17 + src/app/data/document.ts 34 @@ -2180,21 +2312,21 @@ Results src/app/components/admin/tasks/tasks.component.html - 147,148 + 156,157 Info src/app/components/admin/tasks/tasks.component.html - 149,150 + 158,159 Actions src/app/components/admin/tasks/tasks.component.html - 150,151 + 159,160 src/app/components/admin/trash/trash.component.html @@ -2217,16 +2349,12 @@ 67,68 - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 38,39 + src/app/components/document-detail/document-detail.component.html + 44 src/app/components/document-detail/document-detail.component.html - 65 - - - src/app/components/document-detail/document-detail.component.html - 66 + 45 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -2246,35 +2374,35 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 44,45 + 46,47 src/app/components/manage/document-attributes/management-list/management-list.component.html - 44,45 + 46,47 src/app/components/manage/document-attributes/management-list/management-list.component.html - 44,45 + 46,47 src/app/components/manage/document-attributes/management-list/management-list.component.html - 44,45 + 46,47 src/app/components/manage/document-attributes/management-list/management-list.component.html - 116 + 118 src/app/components/manage/document-attributes/management-list/management-list.component.html - 116 + 118 src/app/components/manage/document-attributes/management-list/management-list.component.html - 116 + 118 src/app/components/manage/document-attributes/management-list/management-list.component.html - 116 + 118 src/app/components/manage/mail/mail.component.html @@ -2296,6 +2424,14 @@ src/app/components/manage/saved-views/saved-views.component.html 40,41 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 22,23 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 19,20 + src/app/components/manage/workflows/workflows.component.html 21,22 @@ -2309,33 +2445,33 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 201 + 209 View task details src/app/components/admin/tasks/tasks.component.html - 207 + 215 Dismiss src/app/components/admin/tasks/tasks.component.html - 214 + 222 src/app/components/admin/tasks/tasks.component.ts - 317 + 326 src/app/components/admin/tasks/tasks.component.ts - 351 + 360 src/app/components/document-detail/document-detail.component.ts - 673 + 715 src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html @@ -2346,28 +2482,28 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 219 + 227 Result message src/app/components/admin/tasks/tasks.component.html - 232,233 + 240,241 Duplicate src/app/components/admin/tasks/tasks.component.html - 239,240 + 247,248 Open src/app/components/admin/tasks/tasks.component.html - 247 + 255 src/app/components/app-frame/global-search/global-search.component.html @@ -2398,77 +2534,77 @@ Input data src/app/components/admin/tasks/tasks.component.html - 257,258 + 265,266 Result data src/app/components/admin/tasks/tasks.component.html - 263,264 + 271,272 No tasks match the current filters. src/app/components/admin/tasks/tasks.component.html - 285,287 + 293,295 Result src/app/components/admin/tasks/tasks.component.ts - 50 + 54 Needs attention src/app/components/admin/tasks/tasks.component.ts - 55 + 59 In progress src/app/components/admin/tasks/tasks.component.ts - 56 + 60 Recently completed src/app/components/admin/tasks/tasks.component.ts - 57 + 61 Consume File src/app/components/admin/tasks/tasks.component.ts - 66 + 70 Train Classifier src/app/components/admin/tasks/tasks.component.ts - 70 + 74 Sanity Check src/app/components/admin/tasks/tasks.component.ts - 74 + 78 Mail Fetch src/app/components/admin/tasks/tasks.component.ts - 76 + 80 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -2479,56 +2615,63 @@ LLM Index src/app/components/admin/tasks/tasks.component.ts - 77 + 81 Empty Trash src/app/components/admin/tasks/tasks.component.ts - 80 + 84 Check Workflows src/app/components/admin/tasks/tasks.component.ts - 84 + 88 Bulk Update src/app/components/admin/tasks/tasks.component.ts - 88 + 92 Reprocess Document src/app/components/admin/tasks/tasks.component.ts - 92 + 96 Build Share Link src/app/components/admin/tasks/tasks.component.ts - 96 + 100 Bulk Delete src/app/components/admin/tasks/tasks.component.ts - 100 + 104 + + + + Apply AI Suggestions + + src/app/components/admin/tasks/tasks.component.ts + 108 Scheduled src/app/components/admin/tasks/tasks.component.ts - 110 + 118 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -2539,7 +2682,7 @@ Web UI src/app/components/admin/tasks/tasks.component.ts - 112 + 120 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -2550,7 +2693,7 @@ API Upload src/app/components/admin/tasks/tasks.component.ts - 115 + 123 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -2561,106 +2704,106 @@ Folder Consume src/app/components/admin/tasks/tasks.component.ts - 119 + 127 Email Consume src/app/components/admin/tasks/tasks.component.ts - 123 + 131 System src/app/components/admin/tasks/tasks.component.ts - 125 + 133 Manual src/app/components/admin/tasks/tasks.component.ts - 126 + 134 Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 239 + 248 Dismiss visible src/app/components/admin/tasks/tasks.component.ts - 240 + 249 Confirm Dismiss src/app/components/admin/tasks/tasks.component.ts - 314 + 323 Dismiss tasks? src/app/components/admin/tasks/tasks.component.ts - 315 + 324 Error dismissing tasks src/app/components/admin/tasks/tasks.component.ts - 326 + 335 src/app/components/admin/tasks/tasks.component.ts - 360 + 369 Error dismissing task src/app/components/admin/tasks/tasks.component.ts - 338 + 347 Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 348 + 357 Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 349 + 358 Success. New document id created src/app/components/admin/tasks/tasks.component.ts - 408 + 417 Duplicate of document # src/app/components/admin/tasks/tasks.component.ts - 418 + 427 src/app/components/admin/tasks/tasks.component.ts - 452 + 461 @@ -2671,11 +2814,11 @@ src/app/components/app-frame/app-frame.component.html - 266 + 305 src/app/components/app-frame/app-frame.component.html - 268 + 307 @@ -2755,7 +2898,7 @@ src/app/components/admin/trash/trash.component.ts - 117 + 119 src/app/components/admin/users-groups/users-groups.component.html @@ -2783,7 +2926,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 242,243 + 243,244 src/app/components/common/permissions-select/permissions-select.component.html @@ -2795,11 +2938,11 @@ src/app/components/document-detail/document-detail.component.html - 23 + 2 src/app/components/document-detail/document-detail.component.html - 24,25 + 3,4 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -2819,35 +2962,35 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 121,122 + 123,124 src/app/components/manage/document-attributes/management-list/management-list.component.html - 121,122 + 123,124 src/app/components/manage/document-attributes/management-list/management-list.component.html - 121,122 + 123,124 src/app/components/manage/document-attributes/management-list/management-list.component.html - 121,122 + 123,124 src/app/components/manage/document-attributes/management-list/management-list.component.html - 140 + 142 src/app/components/manage/document-attributes/management-list/management-list.component.html - 140 + 142 src/app/components/manage/document-attributes/management-list/management-list.component.html - 140 + 142 src/app/components/manage/document-attributes/management-list/management-list.component.html - 140 + 142 src/app/components/manage/document-attributes/management-list/management-list.component.ts @@ -2897,7 +3040,7 @@ src/app/components/admin/trash/trash.component.ts - 111 + 113 src/app/components/manage/document-attributes/management-list/management-list.component.ts @@ -2923,19 +3066,19 @@ src/app/components/admin/trash/trash.component.ts - 115 + 117 src/app/components/admin/users-groups/users-groups.component.ts - 145 + 146 src/app/components/admin/users-groups/users-groups.component.ts - 198 + 203 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 104 + 106 src/app/components/manage/document-attributes/management-list/management-list.component.ts @@ -2943,11 +3086,11 @@ src/app/components/manage/mail/mail.component.ts - 195 + 197 src/app/components/manage/mail/mail.component.ts - 297 + 301 src/app/components/manage/workflows/workflows.component.ts @@ -2965,63 +3108,71 @@ Error deleting document "" src/app/components/admin/trash/trash.component.ts - 98 + 100 This operation will permanently delete the selected documents. src/app/components/admin/trash/trash.component.ts - 113 + 115 This operation will permanently delete all documents in the trash. src/app/components/admin/trash/trash.component.ts - 114 + 116 Document(s) deleted src/app/components/admin/trash/trash.component.ts - 125 + 128 Error deleting document(s) src/app/components/admin/trash/trash.component.ts - 132 + 138 Document "" restored src/app/components/admin/trash/trash.component.ts - 145 + 151 Error restoring document "" src/app/components/admin/trash/trash.component.ts - 156 + 163 Document(s) restored src/app/components/admin/trash/trash.component.ts - 168 + 176 + + + src/app/services/trash.service.ts + 60 Error restoring document(s) src/app/components/admin/trash/trash.component.ts - 174 + 185 + + + src/app/services/trash.service.ts + 67 @@ -3032,11 +3183,11 @@ src/app/components/app-frame/app-frame.component.html - 296 + 335 src/app/components/app-frame/app-frame.component.html - 298 + 337 @@ -3110,7 +3261,7 @@ src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 53,54 + 55,56 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html @@ -3122,35 +3273,35 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 120,121 + 122,123 src/app/components/manage/document-attributes/management-list/management-list.component.html - 120,121 + 122,123 src/app/components/manage/document-attributes/management-list/management-list.component.html - 120,121 + 122,123 src/app/components/manage/document-attributes/management-list/management-list.component.html - 120,121 + 122,123 src/app/components/manage/document-attributes/management-list/management-list.component.html - 137 + 139 src/app/components/manage/document-attributes/management-list/management-list.component.html - 137 + 139 src/app/components/manage/document-attributes/management-list/management-list.component.html - 137 + 139 src/app/components/manage/document-attributes/management-list/management-list.component.html - 137 + 139 src/app/components/manage/mail/mail.component.html @@ -3206,67 +3357,67 @@ Saved user "". src/app/components/admin/users-groups/users-groups.component.ts - 125 + 126 Error saving user. src/app/components/admin/users-groups/users-groups.component.ts - 135 + 136 Confirm delete user account src/app/components/admin/users-groups/users-groups.component.ts - 143 + 144 This operation will permanently delete this user account. src/app/components/admin/users-groups/users-groups.component.ts - 144 + 145 Proceed src/app/components/admin/users-groups/users-groups.component.ts - 147 + 148 src/app/components/admin/users-groups/users-groups.component.ts - 200 + 205 src/app/components/document-detail/document-detail.component.ts - 1422 + 1527 src/app/components/document-detail/document-detail.component.ts - 1809 + 1914 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 927 + 954 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 966 + 993 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 989 + 1016 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1025 + 1052 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 106 + 108 src/app/components/manage/document-attributes/management-list/management-list.component.ts @@ -3274,11 +3425,11 @@ src/app/components/manage/mail/mail.component.ts - 197 + 199 src/app/components/manage/mail/mail.component.ts - 299 + 303 src/app/components/manage/workflows/workflows.component.ts @@ -3289,56 +3440,56 @@ Deleted user "" src/app/components/admin/users-groups/users-groups.component.ts - 153 + 155 Error deleting user "". src/app/components/admin/users-groups/users-groups.component.ts - 160 + 163 Saved group "". src/app/components/admin/users-groups/users-groups.component.ts - 180 + 184 Error saving group. src/app/components/admin/users-groups/users-groups.component.ts - 188 + 193 Confirm delete user group src/app/components/admin/users-groups/users-groups.component.ts - 196 + 201 This operation will permanently delete this user group. src/app/components/admin/users-groups/users-groups.component.ts - 197 + 202 Deleted group "" src/app/components/admin/users-groups/users-groups.component.ts - 206 + 212 Error deleting group "". src/app/components/admin/users-groups/users-groups.component.ts - 213 + 220 @@ -3348,101 +3499,126 @@ 24,25 + + Upload documents + + src/app/components/app-frame/app-frame.component.html + 36 + + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 6,7 + + + + Upload + + src/app/components/app-frame/app-frame.component.html + 37,38 + + + src/app/components/common/input/file/file.component.html + 15,16 + + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 38,39 + + + + Show document processing status + + src/app/components/app-frame/app-frame.component.html + 41 + + User menu src/app/components/app-frame/app-frame.component.html - 42 + 54 Logged in as src/app/components/app-frame/app-frame.component.html - 50,51 + 62,63 My Profile src/app/components/app-frame/app-frame.component.html - 54 + 66 Logout src/app/components/app-frame/app-frame.component.html - 61 + 73 - - Documentation + + Upload Files src/app/components/app-frame/app-frame.component.html - 66 - - - src/app/components/app-frame/app-frame.component.html - 327,328 - - - src/app/components/app-frame/app-frame.component.html - 330 + 86,88 Saved views src/app/components/app-frame/app-frame.component.html - 110,111 + 128,129 src/app/components/app-frame/app-frame.component.html - 140,141 + 158,159 Open documents src/app/components/app-frame/app-frame.component.html - 149,150 + 167,168 Close all src/app/components/app-frame/app-frame.component.html - 171 + 189 src/app/components/app-frame/app-frame.component.html - 173 + 191 Manage src/app/components/app-frame/app-frame.component.html - 182,183 + 200,201 Attributes src/app/components/app-frame/app-frame.component.html - 190 + 208 src/app/components/app-frame/app-frame.component.html - 192 + 210 Correspondents src/app/components/app-frame/app-frame.component.html - 218 + 236 src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html @@ -3461,7 +3637,7 @@ Document types src/app/components/app-frame/app-frame.component.html - 223 + 241 src/app/components/manage/document-attributes/document-attributes.component.ts @@ -3472,7 +3648,7 @@ Storage paths src/app/components/app-frame/app-frame.component.html - 228 + 246 src/app/components/manage/document-attributes/document-attributes.component.ts @@ -3483,7 +3659,7 @@ Custom fields src/app/components/app-frame/app-frame.component.html - 233 + 251 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -3498,118 +3674,107 @@ 125 - - Workflows + + Share links src/app/components/app-frame/app-frame.component.html - 251 + 271 src/app/components/app-frame/app-frame.component.html - 253 + 273 - src/app/components/manage/workflows/workflows.component.html + src/app/components/manage/share-links/share-links.component.html 2,3 - - Mail - - src/app/components/app-frame/app-frame.component.html - 259 - - - src/app/components/app-frame/app-frame.component.html - 261 - - Administration src/app/components/app-frame/app-frame.component.html - 276,277 + 315,316 Configuration src/app/components/app-frame/app-frame.component.html - 289 + 328 src/app/components/app-frame/app-frame.component.html - 291 + 330 GitHub src/app/components/app-frame/app-frame.component.html - 337 + 379 is available. src/app/components/app-frame/app-frame.component.html - 347 + 389 Click to view. src/app/components/app-frame/app-frame.component.html - 347 + 389 Paperless-ngx can automatically check for updates src/app/components/app-frame/app-frame.component.html - 351 + 393 How does this work? src/app/components/app-frame/app-frame.component.html - 359 + 401 Update available src/app/components/app-frame/app-frame.component.html - 371 + 413 Configure update checking src/app/components/app-frame/app-frame.component.html - 376 + 418 Sidebar views updated src/app/components/app-frame/app-frame.component.ts - 454 + 497 Error updating sidebar views src/app/components/app-frame/app-frame.component.ts - 457 + 500 An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 478 + 521 @@ -3642,15 +3807,15 @@ src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 123 + 125 src/app/components/document-detail/document-detail.component.html - 38 + 17 src/app/components/document-detail/document-detail.component.html - 44,45 + 23,24 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -3790,14 +3955,14 @@ Clear All src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html - 16,17 + 15 No notifications src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html - 20,21 + 22 @@ -3811,29 +3976,120 @@ 21 + + Ask about this document + + src/app/components/chat/chat/chat.component.html + 11 + + + + Ask about your documents + + src/app/components/chat/chat/chat.component.html + 13 + + + + Clear chat + + src/app/components/chat/chat/chat.component.html + 17 + + + + Answers come from your documents, with links to their sources. + + src/app/components/chat/chat/chat.component.html + 25,26 + + + + Still thinking... + + src/app/components/chat/chat/chat.component.html + 34 + + + + Thinking... + + src/app/components/chat/chat/chat.component.html + 36 + + + + Sources + + src/app/components/chat/chat/chat.component.html + 46,47 + + Message src/app/components/chat/chat/chat.component.html - 32,33 + 61,62 src/app/components/common/email-document-dialog/email-document-dialog.component.html 19,20 + + Stop + + src/app/components/chat/chat/chat.component.html + 74 + + + src/app/components/chat/chat/chat.component.html + 74 + + + + Send + + src/app/components/chat/chat/chat.component.html + 78 + + + src/app/components/chat/chat/chat.component.html + 78 + + + src/app/components/document-detail/document-detail.component.html + 73 + + + src/app/components/document-detail/document-detail.component.html + 74 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 111 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 113 + + + src/app/data/saved-view-icons.ts + 79 + + Ask a question about this document... src/app/components/chat/chat/chat.component.ts - 49 + 61 Ask a question about a document... src/app/components/chat/chat/chat.component.ts - 50 + 62 @@ -3855,7 +4111,7 @@ src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 103 + 105 src/app/components/document-list/document-list.component.html @@ -3888,31 +4144,31 @@ src/app/components/document-detail/document-detail.component.ts - 1375 + 1476 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 559 + 572 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 599 + 612 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 637 + 650 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 675 + 688 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 737 + 750 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 875 + 888 @@ -4032,7 +4288,7 @@ src/app/components/document-detail/document-detail.component.ts - 1862 + 1967 @@ -4043,7 +4299,7 @@ src/app/components/document-detail/document-detail.component.ts - 1863 + 1968 @@ -4054,7 +4310,7 @@ src/app/components/document-detail/document-detail.component.ts - 1864 + 1969 @@ -4100,7 +4356,7 @@ src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 34,35 + 36,37 src/app/components/common/permissions-select/permissions-select.component.html @@ -4140,22 +4396,22 @@ Saved field "". src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 132 + 133 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 85 + 86 Error saving field. src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 141 + 143 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 94 + 96 @@ -4230,13 +4486,9 @@ src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.ts 81 - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 155,156 - src/app/components/document-detail/document-detail.component.html - 118 + 97 src/app/guards/dirty-saved-view.guard.ts @@ -5041,7 +5293,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 265 + 266 @@ -5059,7 +5311,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 266 + 267 @@ -5094,7 +5346,7 @@ src/app/components/common/toast/toast.component.html - 30,31 + 41,42 src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html @@ -5310,7 +5562,7 @@ src/app/components/document-detail/document-detail.component.html - 364,365 + 352,353 @@ -5429,7 +5681,7 @@ src/app/components/document-detail/document-detail.component.html - 103,104 + 82,83 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -5781,332 +6033,332 @@ Complete the custom field query configuration. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 225 + 226 Action type src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 258 + 259 Assign title src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 263 + 264 Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 263 + 264 Assign tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 264 + 265 Assign storage path src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 267 + 268 Assign custom fields src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 268 + 269 Assign owner src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 272 + 273 Assign view permissions src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 274,275 + 275,276 Assign edit permissions src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 293,294 + 294,295 Remove tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 320,321 + 321,322 Remove all src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 321 + 322 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 327 + 328 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 333 + 334 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 339 + 340 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 345 + 346 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 352 + 353 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 358 + 359 Remove correspondents src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 326,327 + 327,328 Remove document types src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 332,333 + 333,334 Remove storage paths src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 338,339 + 339,340 Remove custom fields src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 344,345 + 345,346 Remove owners src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 351,352 + 352,353 Remove permissions src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 357,358 + 358,359 View permissions src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 360,361 + 361,362 Edit permissions src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 379,380 + 380,381 Email subject src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 407 + 408 Email body src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 408 + 409 Email recipients src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 409 + 410 Attach document src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 410 + 411 Webhook url src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 418 + 419 Use parameters for webhook body src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 420 + 421 Send webhook payload as JSON src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 421 + 422 Webhook params src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 424 + 425 Webhook body src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 426 + 427 Webhook headers src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 428 + 429 Include document src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 429 + 430 One password per line. The workflow will try them in order until one succeeds. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 437 + 438 Passwords src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 441,442 + 442,443 Passwords are stored in plain text. Use with caution. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 445,446 + 446,447 The document will be moved to the trash at the end of the workflow run. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 454,455 + 455,456 The document will be sent to the configured remote OCR service. May incur costs. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 461,462 + 462,463 The document will be sent to the configured AI service for suggestions. Consider costs and privacy. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 468,469 + 469,470 This action runs in the background, so the suggestions may be applied after the other actions of this workflow have finished. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 469,470 + 470,471 Apply suggestions for src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 472,473 + 473,474 Suggestions for fields that are not selected are discarded. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 477,478 + 478,479 Create missing items src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 487,488 + 488,489 Create suggested tags, correspondents and document types that do not exist yet. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 489,490 + 490,491 Overwrite existing values src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 497,498 + 498,499 Apply suggestions even if the document already has a value. Tags are always added, never replaced. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 499,500 + 500,501 @@ -6191,11 +6443,11 @@ src/app/components/document-detail/document-detail.component.ts - 1379 + 1480 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 879 + 892 @@ -6224,7 +6476,7 @@ src/app/components/document-detail/document-detail.component.html - 171 + 143 src/app/components/document-list/document-list.component.html @@ -6667,17 +6919,6 @@ 16 - - Upload - - src/app/components/common/input/file/file.component.html - 15,16 - - - src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html - 38,39 - - Show password @@ -6689,14 +6930,14 @@ Edit Permissions src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 9,10 + 11,12 Owner: src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 26,27 + 28,29 @@ -6779,6 +7020,13 @@ 20 + + Copy ID + + src/app/components/common/page-header/page-header.component.html + 6 + + Copied! @@ -6801,6 +7049,18 @@ src/app/components/common/share-links-dialog/share-links-dialog.component.html 39,40 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 99,100 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 29 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 53,54 + Read more @@ -7044,6 +7304,10 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 56,57 + + src/app/components/document-detail/document-barcodes/document-barcodes.component.html + 5,6 + Change @@ -7263,64 +7527,64 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 221 + 222 Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 239 + 240 Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 266 + 267 Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 285 + 286 TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 309 + 311 Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 311 + 314 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 317 + 320 TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 333 + 337 Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 335 + 340 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 340 + 345 @@ -7347,14 +7611,18 @@ src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html 89,90 - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 35,36 - src/app/components/common/share-links-dialog/share-links-dialog.component.html 52 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 19,20 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 17,18 + Share archive version (if available) @@ -7383,17 +7651,13 @@ src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html 60,61 - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 33,34 - src/app/components/common/system-status-dialog/system-status-dialog.component.html 58,59 src/app/components/common/toast/toast.component.html - 28,29 + 39,40 src/app/components/manage/mail/mail.component.html @@ -7403,6 +7667,10 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 35,36 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 17,18 + src/app/components/manage/workflows/workflows.component.html 19,20 @@ -7443,8 +7711,12 @@ 95,96 - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 101,102 + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 88,89 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 43,44 src/app/data/share-link.ts @@ -7458,8 +7730,12 @@ 98,99 - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 37,38 + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 21,22 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 18,19 @@ -7469,8 +7745,8 @@ 101,102 - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 34,35 + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 18,19 @@ -7505,122 +7781,6 @@ 60 - - Loading share link bundles… - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 10,11 - - - - Status updates every few seconds while bundles are being prepared. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 21 - - - - No share link bundles currently exist. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 25,27 - - - - Built: - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 48 - - - - View error details - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 62,63 - - - - Copy share link - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 113,114 - - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 122,123 - - - - Retry - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 132,133 - - - - Delete share link bundle - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html - 141,142 - - - - Share link bundles - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 42 - - - - Failed to load share link bundles. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 65 - - - - Error retrieving share link bundles. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 67 - - - - Share link copied to clipboard. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 111 - - - - Share link bundle deleted. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 120 - - - - Error deleting share link bundle. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 126 - - - - Share link bundle rebuild requested. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 138 - - - - Error requesting rebuild. - - src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts - 143 - - No existing links @@ -7642,17 +7802,6 @@ 48,49 - - Share Links - - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 30 - - - src/app/components/document-detail/document-detail.component.html - 99,100 - - Error retrieving links @@ -7696,14 +7845,14 @@ No suggestions src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html - 11,12 + 12,13 Suggest src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html - 13,14 + 14,15 @@ -7731,13 +7880,48 @@ 120 - - {VAR_PLURAL, plural, =1 {1 existing value suggested below} other { existing values suggested below}} + + {VAR_PLURAL, plural, =1 {1 suggestion available below} other { suggestions available below}} src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html 53 + + Suggestion options + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 63,64 + + + + Not using default + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 67,68 + + + + Suggest using: + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 72,73 + + + + ML + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 75 + + + + AI + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 79 + + Environment @@ -7993,9 +8177,57 @@ Copy Raw Error src/app/components/common/toast/toast.component.html - 43 + 54 + + Dismiss completed + + src/app/components/common/upload-status-tray/upload-status-tray.component.html + 11,15 + + This button dismisses all status messages about processed documents in the tray (failed and successful) + + + Toggle document processing status + + src/app/components/common/upload-status-tray/upload-status-tray.component.html + 16 + + + + Processing: + + src/app/components/common/upload-status-tray/upload-status-tray.component.ts + 79 + + + + Failed: + + src/app/components/common/upload-status-tray/upload-status-tray.component.ts + 82 + + + + Added: + + src/app/components/common/upload-status-tray/upload-status-tray.component.ts + 85 + + + + , + + src/app/components/common/upload-status-tray/upload-status-tray.component.ts + 88 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 517 + + this string is used to separate processing, failed and added on the file upload widget + Hint: saved views can be created from the documents list @@ -8031,13 +8263,6 @@ 93 - - Show all - - src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 14,17 - - Error while loading documents @@ -8053,7 +8278,7 @@ Filter by correspondent src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 73 + 75 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -8068,7 +8293,7 @@ Filter by document type src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 83 + 85 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -8083,7 +8308,7 @@ Filter by storage path src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 88 + 90 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -8098,14 +8323,14 @@ Filter by owner src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 93 + 95 No src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 103 + 105 src/app/components/document-list/document-list.component.html @@ -8116,7 +8341,7 @@ No documents src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 187,190 + 189,192 @@ -8182,13 +8407,6 @@ 78 - - Upload documents - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html - 6,7 - - or drop files anywhere @@ -8196,47 +8414,6 @@ 7,8 - - Dismiss completed - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html - 23,27 - - This button dismisses all status messages about processed documents on the dashboard (failed and successful) - - - Processing: - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts - 57 - - - - Failed: - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts - 60 - - - - Added: - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts - 63 - - - - , - - src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts - 66 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 504 - - this string is used to separate processing, failed and added on the file upload widget - Paperless-ngx is running! @@ -8281,9 +8458,13 @@ Page + + src/app/components/document-detail/document-barcodes/document-barcodes.component.html + 4,5 + src/app/components/document-detail/document-detail.component.html - 5,6 + 483 src/app/components/document-list/document-list.component.html @@ -8294,32 +8475,33 @@ 34 - - of + + Content + + src/app/components/document-detail/document-barcodes/document-barcodes.component.html + 6,7 + src/app/components/document-detail/document-detail.component.html - 7,8 + 278,279 - - - + + Copy content - src/app/components/document-detail/document-detail.component.html - 11,12 + src/app/components/document-detail/document-barcodes/document-barcodes.component.html + 32,33 - - - + - src/app/components/document-detail/document-detail.component.html - 19,20 + src/app/components/document-detail/document-barcodes/document-barcodes.component.html + 40,41 Download options src/app/components/document-detail/document-detail.component.html - 48 + 27 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -8330,14 +8512,14 @@ Download original src/app/components/document-detail/document-detail.component.html - 51,52 + 30,31 Use formatted filename src/app/components/document-detail/document-detail.component.html - 57,58 + 36,37 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -8348,7 +8530,7 @@ Reprocess src/app/components/document-detail/document-detail.component.html - 70,71 + 49,50 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -8359,14 +8541,14 @@ Print src/app/components/document-detail/document-detail.component.html - 74,75 + 53,54 More like this src/app/components/document-detail/document-detail.component.html - 78,79 + 57,58 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -8377,87 +8559,57 @@ Remove Password src/app/components/document-detail/document-detail.component.html - 87 - - - - Send - - src/app/components/document-detail/document-detail.component.html - 94 - - - src/app/components/document-detail/document-detail.component.html - 95 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 111 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 113 - - - src/app/data/saved-view-icons.ts - 79 + 66 Previous src/app/components/document-detail/document-detail.component.html - 121 + 100 Next src/app/components/document-detail/document-detail.component.html - 124 + 103 src/main.ts - 469 + 483 Details src/app/components/document-detail/document-detail.component.html - 168,169 + 140,141 Date created src/app/components/document-detail/document-detail.component.html - 175 + 147 Default src/app/components/document-detail/document-detail.component.html - 187 + 159 src/app/components/manage/saved-views/saved-views.component.html 71 - - Content - - src/app/components/document-detail/document-detail.component.html - 294,295 - - Metadata src/app/components/document-detail/document-detail.component.html - 303,304 + 287,288 src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts @@ -8468,423 +8620,516 @@ Date modified src/app/components/document-detail/document-detail.component.html - 310,311 + 294,295 Date added src/app/components/document-detail/document-detail.component.html - 314,315 + 298,299 Media filename src/app/components/document-detail/document-detail.component.html - 318,319 + 302,303 Original filename src/app/components/document-detail/document-detail.component.html - 322,323 + 306,307 Original SHA256 checksum src/app/components/document-detail/document-detail.component.html - 326,327 + 310,311 Original file size src/app/components/document-detail/document-detail.component.html - 330,331 + 314,315 Original mime type src/app/components/document-detail/document-detail.component.html - 334,335 + 318,319 Archive SHA256 checksum src/app/components/document-detail/document-detail.component.html - 339,340 + 323,324 Archive file size src/app/components/document-detail/document-detail.component.html - 345,346 + 329,330 + + + + Barcodes + + src/app/components/document-detail/document-detail.component.html + 338,339 Original document metadata src/app/components/document-detail/document-detail.component.html - 354 + 342 Archived document metadata src/app/components/document-detail/document-detail.component.html - 357 + 345 Notes src/app/components/document-detail/document-detail.component.html - 376,379 + 364,367 History src/app/components/document-detail/document-detail.component.html - 387,388 + 375,376 Duplicates src/app/components/document-detail/document-detail.component.html - 410,413 + 398,401 Duplicate documents detected: src/app/components/document-detail/document-detail.component.html - 415,416 + 403,404 In trash src/app/components/document-detail/document-detail.component.html - 426,427 + 414,415 Save & next src/app/components/document-detail/document-detail.component.html - 455 + 443 Save & close src/app/components/document-detail/document-detail.component.html - 457 + 445 Discard src/app/components/document-detail/document-detail.component.html - 459,460 + 447,448 Document loading... src/app/components/document-detail/document-detail.component.html - 467 + 455 + + + + of + + src/app/components/document-detail/document-detail.component.html + 484,485 + + + + Zoom out + + src/app/components/document-detail/document-detail.component.html + 488 + + + + Zoom + + src/app/components/document-detail/document-detail.component.html + 491 + + + + Zoom in + + src/app/components/document-detail/document-detail.component.html + 498 Enter Password src/app/components/document-detail/document-detail.component.html - 521 + 532 Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 440 + 465 An error occurred loading content: src/app/components/document-detail/document-detail.component.ts - 542,544 + 568,570 src/app/components/document-detail/document-detail.component.ts - 1000,1002 + 1049,1051 Document was updated src/app/components/document-detail/document-detail.component.ts - 668 + 710 Document was updated at . src/app/components/document-detail/document-detail.component.ts - 669 + 711 Reload to discard your local unsaved edits and load the latest remote version. src/app/components/document-detail/document-detail.component.ts - 670 + 712 Reload src/app/components/document-detail/document-detail.component.ts - 672 + 714 Document reloaded with latest changes. src/app/components/document-detail/document-detail.component.ts - 728 + 770 Document reloaded. src/app/components/document-detail/document-detail.component.ts - 739 + 781 Next document src/app/components/document-detail/document-detail.component.ts - 841 + 883 Previous document src/app/components/document-detail/document-detail.component.ts - 851 + 893 Close document src/app/components/document-detail/document-detail.component.ts - 859 + 901 src/app/services/open-documents.service.ts - 143 + 151 Save document src/app/components/document-detail/document-detail.component.ts - 866 + 908 Save and close / next src/app/components/document-detail/document-detail.component.ts - 875 + 917 Error retrieving version content src/app/components/document-detail/document-detail.component.ts - 983 + 1031 + + + + Unsaved Changes + + src/app/components/document-detail/document-detail.component.ts + 1075 + + + src/app/guards/dirty-form.guard.ts + 15 + + + src/app/guards/dirty-saved-view.guard.ts + 27 + + + src/app/services/open-documents.service.ts + 143 + + + src/app/services/open-documents.service.ts + 170 + + + + You have unsaved changes to the content of this version. + + src/app/components/document-detail/document-detail.component.ts + 1076 + + + + Switching versions will discard them. + + src/app/components/document-detail/document-detail.component.ts + 1077 + + + + Discard and switch + + src/app/components/document-detail/document-detail.component.ts + 1079 + + + + Save and switch + + src/app/components/document-detail/document-detail.component.ts + 1081 Error retrieving suggestions. src/app/components/document-detail/document-detail.component.ts - 1043 + 1124 Document "" saved successfully. src/app/components/document-detail/document-detail.component.ts - 1255 + 1355 src/app/components/document-detail/document-detail.component.ts - 1282 + 1383 Error saving document "" src/app/components/document-detail/document-detail.component.ts - 1288 + 1389 Error saving document src/app/components/document-detail/document-detail.component.ts - 1343 + 1444 Do you really want to move the document "" to the trash? src/app/components/document-detail/document-detail.component.ts - 1376 + 1477 Documents can be restored prior to permanent deletion. src/app/components/document-detail/document-detail.component.ts - 1377 + 1478 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 877 + 890 + + + + Moved "" to the trash + + src/app/components/document-detail/document-detail.component.ts + 1496 Error deleting document src/app/components/document-detail/document-detail.component.ts - 1398 + 1503 Reprocess confirm src/app/components/document-detail/document-detail.component.ts - 1418 + 1523 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 923 + 950 This operation will permanently recreate the archive file for this document. src/app/components/document-detail/document-detail.component.ts - 1419 + 1524 The archive file will be re-generated with the current settings. src/app/components/document-detail/document-detail.component.ts - 1420 + 1525 Reprocess operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1433 + 1538 Error executing operation src/app/components/document-detail/document-detail.component.ts - 1444 + 1549 Error downloading document src/app/components/document-detail/document-detail.component.ts - 1508 + 1613 Page Fit src/app/components/document-detail/document-detail.component.ts - 1586 + 1691 PDF edit operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1829 + 1934 Error executing PDF edit operation src/app/components/document-detail/document-detail.component.ts - 1841 + 1946 Please enter the current password before attempting to remove it. src/app/components/document-detail/document-detail.component.ts - 1852 + 1957 Password removal operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1886 + 1991 Error executing password removal operation src/app/components/document-detail/document-detail.component.ts - 1900 + 2005 Print failed. src/app/components/document-detail/document-detail.component.ts - 1950 + 2055 Error loading document for printing. src/app/components/document-detail/document-detail.component.ts - 1959 + 2064 An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts - 2042 + 2147 src/app/components/document-detail/document-detail.component.ts - 2048 + 2153 @@ -9168,7 +9413,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1023 + 1050 @@ -9203,25 +9448,25 @@ Error executing bulk operation src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 338 + 349 "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 496 + 509 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 502 + 515 "" and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 498 + 511 This is for messages like 'modify "tag1" and "tag2"' @@ -9229,7 +9474,7 @@ and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 506,508 + 519,521 this is for messages like 'modify "tag1", "tag2" and "tag3"' @@ -9237,14 +9482,14 @@ Confirm tags assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 523 + 536 This operation will add the tag "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 529 + 542 @@ -9253,14 +9498,14 @@ )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 534,536 + 547,549 This operation will remove the tag "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 542 + 555 @@ -9269,7 +9514,7 @@ )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 547,549 + 560,562 @@ -9280,84 +9525,84 @@ )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 551,555 + 564,568 Confirm correspondent assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 592 + 605 This operation will assign the correspondent "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 594 + 607 This operation will remove the correspondent from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 596 + 609 Confirm document type assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 630 + 643 This operation will assign the document type "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 632 + 645 This operation will remove the document type from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 634 + 647 Confirm storage path assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 668 + 681 This operation will assign the storage path "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 670 + 683 This operation will remove the storage path from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 672 + 685 Confirm custom field assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 701 + 714 This operation will assign the custom field "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 707 + 720 @@ -9366,14 +9611,14 @@ )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 712,714 + 725,727 This operation will remove the custom field "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 720 + 733 @@ -9382,7 +9627,7 @@ )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 725,727 + 738,740 @@ -9393,105 +9638,112 @@ )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 729,733 + 742,746 Move selected document(s) to the trash? src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 876 + 889 + + + + Moved document(s) to the trash + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 916 This operation will permanently recreate the archive files for selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 924 + 951 The archive files will be re-generated with the current settings. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 925 + 952 Rotate confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 963 + 990 This operation will add rotated versions of the document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 964 + 991 Merge confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 987 + 1014 This operation will merge selected documents into a new document. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 988 + 1015 Merged document will be queued for consumption. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1011 + 1038 The selected documents will become versions of the root document. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1024 + 1051 Documents merged as versions. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1039 + 1066 Custom fields updated. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1065 + 1092 Error updating custom fields. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1074 + 1101 Share link bundle creation requested. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1122 + 1149 Share link bundle creation is not available yet. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 1129 + 1156 @@ -9705,7 +9957,7 @@ src/app/components/document-list/document-list.component.ts - 348 + 351 src/app/components/manage/document-attributes/document-attributes.component.html @@ -9720,7 +9972,7 @@ src/app/components/document-list/document-list.component.ts - 341 + 344 src/app/components/manage/document-attributes/document-attributes.component.html @@ -9976,56 +10228,56 @@ Reset filters / selection src/app/components/document-list/document-list.component.ts - 329 + 332 Open first [selected] document src/app/components/document-list/document-list.component.ts - 357 + 360 Previous page src/app/components/document-list/document-list.component.ts - 373 + 376 Next page src/app/components/document-list/document-list.component.ts - 385 + 388 View "" saved successfully. src/app/components/document-list/document-list.component.ts - 419 + 422 Failed to save view "". src/app/components/document-list/document-list.component.ts - 425 + 428 View "" created successfully. src/app/components/document-list/document-list.component.ts - 494 + 497 View "" created successfully, but could not update visibility settings. src/app/components/document-list/document-list.component.ts - 500 + 503 @@ -10053,7 +10305,7 @@ Duplicates src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 208 @@ -10351,22 +10603,11 @@ 6,7 - - Initiating upload... - - src/app/components/file-drop/file-drop.component.ts - 137 - - - src/app/components/file-drop/file-drop.component.ts - 146 - - Failed to read dropped items: src/app/components/file-drop/file-drop.component.ts - 142 + 141 @@ -10384,19 +10625,19 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html - 129,130 + 131,132 src/app/components/manage/document-attributes/management-list/management-list.component.html - 129,130 + 131,132 src/app/components/manage/document-attributes/management-list/management-list.component.html - 129,130 + 131,132 src/app/components/manage/document-attributes/management-list/management-list.component.html - 129,130 + 131,132 @@ -10410,28 +10651,28 @@ Confirm delete field src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 102 + 104 This operation will permanently delete this field. src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 103 + 105 Deleted field "" src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 112 + 115 Error deleting field "". src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts - 121 + 125 @@ -10534,6 +10775,14 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html 12,13 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 147,148 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 87,88 + per page @@ -10553,62 +10802,70 @@ src/app/components/manage/document-attributes/management-list/management-list.component.html 20,21 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 153,154 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 93,94 + Matching src/app/components/manage/document-attributes/management-list/management-list.component.html - 39,40 + 41,42 src/app/components/manage/document-attributes/management-list/management-list.component.html - 39,40 + 41,42 src/app/components/manage/document-attributes/management-list/management-list.component.html - 39,40 + 41,42 src/app/components/manage/document-attributes/management-list/management-list.component.html - 39,40 + 41,42 Document count src/app/components/manage/document-attributes/management-list/management-list.component.html - 40,41 + 42,43 src/app/components/manage/document-attributes/management-list/management-list.component.html - 40,41 + 42,43 src/app/components/manage/document-attributes/management-list/management-list.component.html - 40,41 + 42,43 src/app/components/manage/document-attributes/management-list/management-list.component.html - 40,41 + 42,43 {VAR_PLURAL, plural, =1 {One } other { total }} src/app/components/manage/document-attributes/management-list/management-list.component.html - 67 + 69 src/app/components/manage/document-attributes/management-list/management-list.component.html - 67 + 69 src/app/components/manage/document-attributes/management-list/management-list.component.html - 67 + 69 src/app/components/manage/document-attributes/management-list/management-list.component.html - 67 + 69 @@ -10670,6 +10927,14 @@ src/app/components/manage/document-attributes/management-list/management-list.component.ts 328 + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 84 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.ts + 82 + Permissions updated successfully @@ -10686,7 +10951,7 @@ src/app/components/manage/mail/mail.component.ts - 346 + 350 src/app/components/manage/saved-views/saved-views.component.ts @@ -10704,14 +10969,14 @@ Objects deleted successfully src/app/components/manage/document-attributes/management-list/management-list.component.ts - 471 + 472 Error deleting objects src/app/components/manage/document-attributes/management-list/management-list.component.ts - 477 + 479 @@ -10873,140 +11138,140 @@ OAuth2 authentication success src/app/components/manage/mail/mail.component.ts - 138 + 139 OAuth2 authentication failed, see logs for details src/app/components/manage/mail/mail.component.ts - 149 + 151 Saved account "". src/app/components/manage/mail/mail.component.ts - 173 + 175 Error saving account. src/app/components/manage/mail/mail.component.ts - 185 + 187 Confirm delete mail account src/app/components/manage/mail/mail.component.ts - 193 + 195 This operation will permanently delete this mail account. src/app/components/manage/mail/mail.component.ts - 194 + 196 Deleted mail account "" src/app/components/manage/mail/mail.component.ts - 204 + 206 Error deleting mail account "". src/app/components/manage/mail/mail.component.ts - 215 + 217 Processing mail account "" src/app/components/manage/mail/mail.component.ts - 227 + 229 Error processing mail account "" src/app/components/manage/mail/mail.component.ts - 232 + 234 Saved rule "". src/app/components/manage/mail/mail.component.ts - 251 + 254 Error saving rule. src/app/components/manage/mail/mail.component.ts - 262 + 266 Rule "" enabled. src/app/components/manage/mail/mail.component.ts - 278 + 282 Rule "" disabled. src/app/components/manage/mail/mail.component.ts - 279 + 283 Error toggling rule "". src/app/components/manage/mail/mail.component.ts - 284 + 288 Confirm delete mail rule src/app/components/manage/mail/mail.component.ts - 295 + 299 This operation will permanently delete this mail rule. src/app/components/manage/mail/mail.component.ts - 296 + 300 Deleted mail rule "" src/app/components/manage/mail/mail.component.ts - 306 + 310 Error deleting mail rule "". src/app/components/manage/mail/mail.component.ts - 317 + 321 Permissions updated src/app/components/manage/mail/mail.component.ts - 341 + 345 src/app/components/manage/saved-views/saved-views.component.ts @@ -11146,6 +11411,197 @@ 306 + + No share link bundles currently exist. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 9,11 + + + + Built: + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 32 + + + + View error details + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 46,47 + + + + Expired + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 84,85 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 40,41 + + + + Copy share link + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 106,107 + + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 115,116 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 59,60 + + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 67,68 + + + + Retry + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 125,126 + + + + Delete share link bundle + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 134,135 + + + + Share link bundles pagination + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html + 164,165 + + + + Failed to load share link bundles. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 111 + + + + Error retrieving share link bundles. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 113 + + + + Share link bundle deleted. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 181 + + + + Error deleting share link bundle. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 187 + + + + Share link bundle rebuild requested. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 199 + + + + Error requesting rebuild. + + src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.ts + 204 + + + + No document share links currently exist. + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 7,8 + + + + Document + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 15,16 + + + + Delete share link + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 75,76 + + + + Share links pagination + + src/app/components/manage/share-links/share-link-list/share-link-list.component.html + 104,105 + + + + Failed to load share links. + + src/app/components/manage/share-links/share-link-list/share-link-list.component.ts + 105 + + + + Error retrieving share links. + + src/app/components/manage/share-links/share-link-list/share-link-list.component.ts + 107 + + + + Share link deleted. + + src/app/components/manage/share-links/share-link-list/share-link-list.component.ts + 154 + + + + Error deleting share link. + + src/app/components/manage/share-links/share-link-list/share-link-list.component.ts + 159 + + + + Manage public links to individual documents and document bundles. + + src/app/components/manage/share-links/share-links.component.html + 4,5 + + + + Document links + + src/app/components/manage/share-links/share-links.component.html + 18,19 + + + + Bundles + + src/app/components/manage/share-links/share-links.component.html + 26,27 + + Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. @@ -11735,109 +12191,130 @@ 328 + + Store Barcode Contents + + src/app/data/paperless-config.ts + 335 + + AI Enabled src/app/data/paperless-config.ts - 335 + 342 Consider privacy implications when enabling AI features, especially if using a remote model. src/app/data/paperless-config.ts - 339 + 346 LLM Embedding Backend src/app/data/paperless-config.ts - 343 + 350 LLM Embedding Model src/app/data/paperless-config.ts - 351 + 358 + + + + LLM Embedding API Key + + src/app/data/paperless-config.ts + 365 + + + + Used for embeddings when set, otherwise LLM API key is used. + + src/app/data/paperless-config.ts + 367 LLM Embedding Endpoint src/app/data/paperless-config.ts - 358 + 373 LLM Embedding Chunk Size src/app/data/paperless-config.ts - 365 + 380 LLM Context Size src/app/data/paperless-config.ts - 372 + 387 LLM Backend src/app/data/paperless-config.ts - 379 + 394 LLM Model src/app/data/paperless-config.ts - 387 + 402 LLM API Key src/app/data/paperless-config.ts - 394 + 409 LLM Endpoint src/app/data/paperless-config.ts - 401 + 416 LLM Output Language src/app/data/paperless-config.ts - 408 + 423 Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set. src/app/data/paperless-config.ts - 412 + 427 LLM Request Timeout src/app/data/paperless-config.ts - 416 + 431 Timeout in seconds for LLM requests. src/app/data/paperless-config.ts - 420 + 435 @@ -12243,25 +12720,6 @@ 16 - - Unsaved Changes - - src/app/guards/dirty-form.guard.ts - 15 - - - src/app/guards/dirty-saved-view.guard.ts - 27 - - - src/app/services/open-documents.service.ts - 135 - - - src/app/services/open-documents.service.ts - 162 - - You have unsaved changes. @@ -12270,7 +12728,7 @@ src/app/services/open-documents.service.ts - 163 + 171 @@ -12410,343 +12868,350 @@ You have unsaved changes to the document src/app/services/open-documents.service.ts - 137 + 145 Are you sure you want to close this document? src/app/services/open-documents.service.ts - 141 + 149 Are you sure you want to close all documents? src/app/services/open-documents.service.ts - 164 + 172 Close documents src/app/services/open-documents.service.ts - 166 + 174 English (US) src/app/services/settings.service.ts - 55 + 56 Afrikaans src/app/services/settings.service.ts - 61 + 62 Arabic src/app/services/settings.service.ts - 67 + 68 Belarusian src/app/services/settings.service.ts - 73 + 74 Bulgarian src/app/services/settings.service.ts - 79 + 80 Catalan src/app/services/settings.service.ts - 85 + 86 Czech src/app/services/settings.service.ts - 91 + 92 Danish src/app/services/settings.service.ts - 97 + 98 German src/app/services/settings.service.ts - 103 + 104 Greek src/app/services/settings.service.ts - 109 + 110 English (GB) src/app/services/settings.service.ts - 115 + 116 Spanish src/app/services/settings.service.ts - 121 + 122 Finnish src/app/services/settings.service.ts - 127 + 128 French src/app/services/settings.service.ts - 133 + 134 Hungarian src/app/services/settings.service.ts - 139 + 140 Indonesian src/app/services/settings.service.ts - 145 + 146 Italian src/app/services/settings.service.ts - 151 + 152 Japanese src/app/services/settings.service.ts - 157 + 158 Korean src/app/services/settings.service.ts - 163 + 164 Luxembourgish src/app/services/settings.service.ts - 169 + 170 Dutch src/app/services/settings.service.ts - 175 + 176 Norwegian src/app/services/settings.service.ts - 181 + 182 Persian src/app/services/settings.service.ts - 187 + 188 Polish src/app/services/settings.service.ts - 193 + 194 Portuguese (Brazil) src/app/services/settings.service.ts - 199 + 200 Portuguese src/app/services/settings.service.ts - 205 + 206 Romanian src/app/services/settings.service.ts - 211 + 212 Russian src/app/services/settings.service.ts - 217 + 218 Slovak src/app/services/settings.service.ts - 223 + 224 Slovenian src/app/services/settings.service.ts - 229 + 230 Serbian src/app/services/settings.service.ts - 235 + 236 Swedish src/app/services/settings.service.ts - 241 + 242 Turkish src/app/services/settings.service.ts - 247 + 248 Ukrainian src/app/services/settings.service.ts - 253 + 254 Vietnamese src/app/services/settings.service.ts - 259 + 260 Chinese Simplified src/app/services/settings.service.ts - 265 + 266 Chinese Traditional src/app/services/settings.service.ts - 271 + 272 ISO 8601 src/app/services/settings.service.ts - 279 + 280 Successfully completed one-time migratration of settings to the database! src/app/services/settings.service.ts - 648 + 661 Unable to migrate settings to the database, please try saving manually. src/app/services/settings.service.ts - 649 + 662 You can restart the tour from the settings page. src/app/services/settings.service.ts - 732 + 745 + + + + Undo + + src/app/services/trash.service.ts + 51 Connecting... src/app/services/upload-documents.service.ts - 25 + 40 Uploading... src/app/services/upload-documents.service.ts - 38 + 53 Upload complete, waiting... src/app/services/upload-documents.service.ts - 42 + 57 HTTP error: src/app/services/upload-documents.service.ts - 56 + 71 @@ -12869,14 +13334,14 @@ Prev src/main.ts - 468 + 482 End src/main.ts - 470 + 484 diff --git a/src-ui/package.json b/src-ui/package.json index 07cff5d46..9f90985bc 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -1,6 +1,6 @@ { "name": "paperless-ngx-ui", - "version": "3.1.3", + "version": "3.3.3", "scripts": { "preinstall": "npx only-allow pnpm", "ng": "ng", @@ -15,21 +15,22 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^22.1.4", - "@angular/common": "~22.1.3", - "@angular/compiler": "~22.1.3", - "@angular/core": "~22.1.3", - "@angular/forms": "~22.1.3", - "@angular/localize": "~22.1.3", - "@angular/platform-browser": "~22.1.3", - "@angular/router": "~22.1.3", + "@angular/cdk": "^22.2.0", + "@angular/common": "~22.2.0", + "@angular/compiler": "~22.2.0", + "@angular/core": "~22.2.0", + "@angular/forms": "~22.2.0", + "@angular/localize": "~22.2.0", + "@angular/platform-browser": "~22.2.0", + "@angular/router": "~22.2.0", "@ng-bootstrap/ng-bootstrap": "^21.0.0", - "@ng-select/ng-select": "~24.0.2", + "@ng-select/ng-select": "~24.1.2", "@ngneat/dirty-check-forms": "^3.0.3", "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.8", "file-saver": "^2.0.5", "lodash-es": "^4.18.1", + "marked": "~18.0.14", "mime-names": "^1.0.0", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^10.1.0", @@ -37,7 +38,7 @@ "ngx-device-detector": "^12.0.0", "ngx-ui-tour-ng-bootstrap": "^19.0.0", "normalize-diacritics": "^5.0.0", - "pdfjs-dist": "^6.2.108", + "pdfjs-dist": "^6.3.289", "rxjs": "^7.8.2", "tslib": "^2.8.1", "utif": "^3.1.0", @@ -45,29 +46,29 @@ }, "devDependencies": { "@angular-builders/jest": "^22.0.1", - "@angular-devkit/core": "^22.1.6", - "@angular-devkit/schematics": "^22.1.6", - "@angular-eslint/builder": "22.1.0", - "@angular-eslint/eslint-plugin": "22.1.0", - "@angular-eslint/eslint-plugin-template": "22.1.0", - "@angular-eslint/schematics": "22.1.0", - "@angular-eslint/template-parser": "22.1.0", - "@angular/build": "22.1.6", - "@angular/cli": "22.1.6", - "@angular/compiler-cli": "~22.1.3", + "@angular-devkit/core": "^22.2.0", + "@angular-devkit/schematics": "^22.2.0", + "@angular-eslint/builder": "22.5.0", + "@angular-eslint/eslint-plugin": "22.5.0", + "@angular-eslint/eslint-plugin-template": "22.5.0", + "@angular-eslint/schematics": "22.5.0", + "@angular-eslint/template-parser": "22.5.0", + "@angular/build": "22.2.0", + "@angular/cli": "22.2.0", + "@angular/compiler-cli": "~22.2.0", "@playwright/test": "^1.62.1", "@types/jest": "^30.0.0", - "@types/node": "^26.4.0", - "@typescript-eslint/eslint-plugin": "^8.68.0", - "@typescript-eslint/parser": "^8.68.0", - "@typescript-eslint/utils": "^8.68.0", - "eslint": "^10.9.1", - "jest": "30.4.2", - "jest-environment-jsdom": "^30.4.1", + "@types/node": "^26.6.2", + "@typescript-eslint/eslint-plugin": "^8.70.1", + "@typescript-eslint/parser": "^8.70.1", + "@typescript-eslint/utils": "^8.70.1", + "eslint": "^10.11.0", + "jest": "30.5.2", + "jest-environment-jsdom": "^30.5.2", "jest-junit": "^17.0.0", "jest-preset-angular": "^17.0.0", "jest-websocket-mock": "^2.5.0", - "prettier": "^3.9.6", + "prettier": "^3.9.9", "prettier-plugin-organize-imports": "^4.3.0", "ts-node": "~10.9.2", "typescript": "^6.0.3" diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 538f96418..34c5c9c99 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -9,38 +9,38 @@ importers: .: dependencies: '@angular/cdk': - specifier: ^22.1.4 - version: 22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + specifier: ^22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/common': - specifier: ~22.1.3 - version: 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) + specifier: ~22.2.0 + version: 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/compiler': - specifier: ~22.1.3 - version: 22.1.3 + specifier: ~22.2.0 + version: 22.2.0 '@angular/core': - specifier: ~22.1.3 - version: 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + specifier: ~22.2.0 + version: 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) '@angular/forms': - specifier: ~22.1.3 - version: 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + specifier: ~22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/localize': - specifier: ~22.1.3 - version: 22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3) + specifier: ~22.2.0 + version: 22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0) '@angular/platform-browser': - specifier: ~22.1.3 - version: 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + specifier: ~22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) '@angular/router': - specifier: ~22.1.3 - version: 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + specifier: ~22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) '@ng-bootstrap/ng-bootstrap': specifier: ^21.0.0 - version: 21.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@popperjs/core@2.11.8)(rxjs@7.8.2) + version: 21.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': - specifier: ~24.0.2 - version: 24.0.2(@angular/cdk@22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)) + specifier: ~24.1.2 + version: 24.1.2(4a7eb56833580f1a9810b0df0995c3c6) '@ngneat/dirty-check-forms': specifier: ^3.0.3 - version: 3.0.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(lodash-es@4.18.1)(rxjs@7.8.2) + version: 3.0.3(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(lodash-es@4.18.1)(rxjs@7.8.2) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -53,30 +53,33 @@ importers: lodash-es: specifier: ^4.18.1 version: 4.18.1 + marked: + specifier: ~18.0.14 + version: 18.0.14 mime-names: specifier: ^1.0.0 version: 1.0.0 ngx-bootstrap-icons: specifier: ^1.9.3 - version: 1.9.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + version: 1.9.3(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) ngx-color: specifier: ^10.1.0 - version: 10.1.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + version: 10.1.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) ngx-cookie-service: specifier: ^22.0.0 - version: 22.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + version: 22.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) ngx-device-detector: specifier: ^12.0.0 - version: 12.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + version: 12.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) ngx-ui-tour-ng-bootstrap: specifier: ^19.0.0 - version: 19.0.0(55dd56417d8b845704494a1b92156fbd) + version: 19.0.0(cd8c036435da1b7a89d66e1b1b6d40d2) normalize-diacritics: specifier: ^5.0.0 version: 5.0.0 pdfjs-dist: - specifier: ^6.2.108 - version: 6.2.108 + specifier: ^6.3.289 + version: 6.3.289 rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -92,37 +95,37 @@ importers: devDependencies: '@angular-builders/jest': specifier: ^22.0.1 - version: 22.0.1(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(chokidar@5.0.0)(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(rxjs@7.8.2)(typescript@6.0.3) + version: 22.0.1(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(chokidar@5.0.0)(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(rxjs@7.8.2)(typescript@6.0.3) '@angular-devkit/core': - specifier: ^22.1.6 - version: 22.1.6(chokidar@5.0.0) + specifier: ^22.2.0 + version: 22.2.0(chokidar@5.0.0) '@angular-devkit/schematics': - specifier: ^22.1.6 - version: 22.1.6(chokidar@5.0.0) + specifier: ^22.2.0 + version: 22.2.0(chokidar@5.0.0) '@angular-eslint/builder': - specifier: 22.1.0 - version: 22.1.0(@angular/cli@22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1))(chokidar@5.0.0)(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + specifier: 22.5.0 + version: 22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@angular-eslint/eslint-plugin': - specifier: 22.1.0 - version: 22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + specifier: 22.5.0 + version: 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@angular-eslint/eslint-plugin-template': - specifier: 22.1.0 - version: 22.1.0(@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.68.0)(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + specifier: 22.5.0 + version: 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@angular-eslint/schematics': - specifier: 22.1.0 - version: 22.1.0(@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@angular/cli@22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1))(@typescript-eslint/types@8.68.0)(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + specifier: 22.5.0 + version: 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@angular-eslint/template-parser': - specifier: 22.1.0 - version: 22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + specifier: 22.5.0 + version: 22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@angular/build': - specifier: 22.1.6 - version: 22.1.6(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3)(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@types/node@26.4.0)(chokidar@5.0.0)(istanbul-lib-instrument@6.0.3(supports-color@8.1.1))(jiti@2.7.0)(postcss@8.5.26)(supports-color@8.1.1)(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.2.0 + version: 22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0)(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@types/node@26.6.2)(istanbul-lib-instrument@6.0.3(supports-color@8.1.1))(jiti@2.7.0)(postcss@8.5.28)(supports-color@8.1.1)(tslib@2.8.1)(typescript@6.0.3) '@angular/cli': - specifier: 22.1.6 - version: 22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1) + specifier: 22.2.0 + version: 22.2.0(@types/node@26.6.2)(chokidar@5.0.0) '@angular/compiler-cli': - specifier: ~22.1.3 - version: 22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3) + specifier: ~22.2.0 + version: 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) '@playwright/test': specifier: ^1.62.1 version: 1.62.1 @@ -130,44 +133,44 @@ importers: specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^26.4.0 - version: 26.4.0 + specifier: ^26.6.2 + version: 26.6.2 '@typescript-eslint/eslint-plugin': - specifier: ^8.68.0 - version: 8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + specifier: ^8.70.1 + version: 8.70.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.68.0 - version: 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + specifier: ^8.70.1 + version: 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) '@typescript-eslint/utils': - specifier: ^8.68.0 - version: 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + specifier: ^8.70.1 + version: 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) eslint: - specifier: ^10.9.1 - version: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) jest: - specifier: 30.4.2 - version: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) + specifier: 30.5.2 + version: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) jest-environment-jsdom: - specifier: ^30.4.1 - version: 30.4.1(supports-color@8.1.1) + specifier: ^30.5.2 + version: 30.5.2(supports-color@8.1.1) jest-junit: specifier: ^17.0.0 version: 17.0.0 jest-preset-angular: specifier: ^17.0.0 - version: 17.0.0(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3) + version: 17.0.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 prettier: - specifier: ^3.9.6 - version: 3.9.6 + specifier: ^3.9.9 + version: 3.9.9 prettier-plugin-organize-imports: specifier: ^4.3.0 - version: 4.3.0(prettier@3.9.6)(typescript@6.0.3) + version: 4.3.0(prettier@3.9.9)(typescript@6.0.3) ts-node: specifier: ~10.9.2 - version: 10.9.2(@types/node@26.4.0)(typescript@6.0.3) + version: 10.9.2(@types/node@26.6.2)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -198,8 +201,13 @@ packages: engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/architect@0.2201.6': - resolution: {integrity: sha512-oGQEdof2/1bZk58PN9dvpGi8pvtbgE5vkP1xRtCqN8dSVxwre1l0pKynOj/Uge1KxjCvs4c1QrQu0vsAnY0vpg==} + '@angular-devkit/architect@0.2201.8': + resolution: {integrity: sha512-EUQo8RDS1my2Bo5FRS+gBYgz1/klfIp9XESfMpTBO04nBkjF6DkPCeOxeAf1CYjWy9nCXcWn968eSdEhV5jXiA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/architect@0.2202.0': + resolution: {integrity: sha512-HxY8JxLd3WxFj45BtDUHZ9I6hO4KebTz32UQ4ZkPh0EMK/TZdspbSgwd2lo1jE6a90knRAQkAsnBTKwWvGSm3A==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true @@ -212,8 +220,17 @@ packages: chokidar: optional: true - '@angular-devkit/core@22.1.6': - resolution: {integrity: sha512-KLBsZoc2RhOy0xSdeYcLoSOqV/fBP3feBmhY9o12ry2IuyW/17sCmWr6XbIfTIYQN6M98Y1ewmwVNFsvV5b0gA==} + '@angular-devkit/core@22.1.8': + resolution: {integrity: sha512-34lsgg2FwMVBX7nR/ZqzRUcdvdYPvSB8XAEr2GudXAyZwLI9ehzfQlagAWR/gEb8p4uCFZW0r7uU0toxydq4Rw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^5.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@22.2.0': + resolution: {integrity: sha512-dELBwXtJWUxFALdEVvdk8qK+XBa17EH5H9NZm+041/esjNi6SaZMusqBgr2PZKq7hD+O2jSCEHbey/hwkz2Awg==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^5.0.0 @@ -225,56 +242,57 @@ packages: resolution: {integrity: sha512-ebY5bwZVB0onxxyTbJch//VidVVV8jo/F13n+TV5s/3ZywsC3/XZsfMHaxlFmpvP/G17+/C9JVoEXT+uwjT+/Q==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-devkit/schematics@22.1.6': - resolution: {integrity: sha512-IbDO9KbQyQm20uinsfT8d9ZtQw41/WVutI/65mAw39WZfN8Ky+MOgOUJCGLiSccMprvZ9YdodBTnN9bLH149Ag==} + '@angular-devkit/schematics@22.1.8': + resolution: {integrity: sha512-Pv3cPa/44kvEwYcqwx4Ns5dhIDmcFNSHhbpheqiEG1Z/u4e2t4zHKDtE3eHZB+8o+IcC7xJj+d+AqGR44RoZDA==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-eslint/builder@22.1.0': - resolution: {integrity: sha512-gmdk06PK0whNJlapIQjRnhud2/n+oIIDBIoLUHWFFxhHRs+ZstVc6+81gf+sYDOm1Ehmb0V3nZAg3YpT1Mk0Eg==} + '@angular-devkit/schematics@22.2.0': + resolution: {integrity: sha512-yhp/LRzKHJOzo2gFm9+H5DKnsT9adi+ItO2pW0pW2B455sqZYE8RJaSku+TSlv+PvWSmbtFsPXNgSRLA6pSk8Q==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-eslint/builder@22.5.0': + resolution: {integrity: sha512-bChGIHOApVk3eXaAfCOxxb54tToIttSzADEUpuBN6cs7Jp7OO96lNpMktv9IPvxfyVrhbriocwNy33jhpRSt0Q==} peerDependencies: - '@angular/cli': '>= 22.0.0 < 23.0.0' eslint: ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/bundled-angular-compiler@22.1.0': - resolution: {integrity: sha512-iOtOQ2jtrtko1rIQo6i+g3ezxGL0lyYv80j4GccFTK1JGh4K+AqYkmaBvfUfNtqoE/7VcKsOoyxaFt6iIpKhaQ==} + '@angular-eslint/bundled-angular-compiler@22.5.0': + resolution: {integrity: sha512-AdvtopHjjenM02LqsgqQbpTWTbE2DqFS4ZJT8YxEIzUKUdLNwkGUgZn9WpKHBHGBvaiA3hj2BLWRCJs/vJmV3g==} - '@angular-eslint/eslint-plugin-template@22.1.0': - resolution: {integrity: sha512-GK/Mwhwvj+MX6DefD29/IfuYjcai5CsCbYJ6Qb9P6IAzZaQqw+EN+CiXxIwzMnzm2edLcJzAsX8iBk4X7sVi2Q==} + '@angular-eslint/eslint-plugin-template@22.5.0': + resolution: {integrity: sha512-qHi292XBe5TIFpPjEKY+NtiFGEZLrYzD8GPVzBuIruaKQz1Y//eqPp3Ve/MYYBbwdj0gD8rPZRjDIXAcsRUMVg==} peerDependencies: - '@angular-eslint/template-parser': 22.1.0 + '@angular-eslint/template-parser': 22.5.0 '@typescript-eslint/types': ^8.0.0 '@typescript-eslint/utils': ^8.0.0 eslint: ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/eslint-plugin@22.1.0': - resolution: {integrity: sha512-nRwdbUiW7vF0gbwtxw2hRGPZYZCNWOTLZKw4HM+I37o5YFIA0CFLtbyRKgZWs6JZCIqzTYSwCyKNsW41Qw0FwQ==} + '@angular-eslint/eslint-plugin@22.5.0': + resolution: {integrity: sha512-3MooyC+F156Aa0XmNLwNMeQFVmSPhJYqPdX8FditvzSYuo5qANZTSbBABMU8XepvmxXcpPmEsj5sQUpbTdRl9Q==} peerDependencies: '@typescript-eslint/utils': ^8.0.0 eslint: ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/schematics@22.1.0': - resolution: {integrity: sha512-/Z7MEO9ys9P5w5itM2mpNW4R/QNAVxtDdcU5LVFulSx/lo7zCDx1rZ/tLDuzbN5k5RGQy5ZkdRIs0MoscsGXQQ==} - peerDependencies: - '@angular/cli': '>= 22.0.0 < 23.0.0' + '@angular-eslint/schematics@22.5.0': + resolution: {integrity: sha512-4B7Bpph/H6vNI0Wfi3p4w4AKw6VJrTG9IGNbSx6NKbPzcwBSaFSuJUpIUxiuzlsaFy6csbRWU2E3UPyXjEfFew==} - '@angular-eslint/template-parser@22.1.0': - resolution: {integrity: sha512-gcufZLI/Rl2fOWtBk2MgMRkH1t+OrbJGxIsfT0w3pVjKm0zwi7njM/dtPbVjCHzsGhx7szQMvY0i0UwTBVYkSw==} + '@angular-eslint/template-parser@22.5.0': + resolution: {integrity: sha512-p0C48htmzd1/Qum3TIQz3FZMWivbkm7x8z3Q6GY3CzNOIzVRKQU2MwZtpocXPkctJGjYnC5wJ58d8Ow4E5LVbA==} peerDependencies: eslint: ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/utils@22.1.0': - resolution: {integrity: sha512-zDPJqgOxlkG20UJWsVDSvnEtC2MfIP0+yKMaQUBL+2nrEknV/fVLrz7ApnerWiDrGTcAms5si49KV10MarMpRA==} + '@angular-eslint/utils@22.5.0': + resolution: {integrity: sha512-i106BkmVnXM3ub5nsaXmAZNk1bnajzVOwrGrEVt9U0mX22zcVlunLMWC49z2dqGjl91Ppw0Xr5ed+QrKWm9Ldg==} peerDependencies: '@typescript-eslint/utils': ^8.0.0 eslint: ^9.0.0 || ^10.0.0 typescript: '*' - '@angular/build@22.1.6': - resolution: {integrity: sha512-J7JBd3hDAV4dlGNMavDC0KjtvbDd4KOddaom1inwkq92tYnD1ljmhDDigAsUBnRvQhJ82cvagD8zi0s9Ki4rTQ==} + '@angular/build@22.2.0': + resolution: {integrity: sha512-9ABYN9zp4DqDfZxiqyIMEB5iec6xIuVys+BfVjOFkwd3tCnOK+DnRtU8OmI7R8BxUZwLzbPqFffZzvCVVfHP7Q==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler': ^22.0.0 @@ -284,7 +302,7 @@ packages: '@angular/platform-browser': ^22.0.0 '@angular/platform-server': ^22.0.0 '@angular/service-worker': ^22.0.0 - '@angular/ssr': ^22.1.6 + '@angular/ssr': ^22.2.0 istanbul-lib-instrument: ^6.0.0 karma: ^6.4.0 less: ^4.2.0 @@ -294,7 +312,7 @@ packages: tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 typescript: '>=6.0 <6.1' - vitest: ^4.0.8 + vitest: ^4.0.8 || ^5.0.0 peerDependenciesMeta: '@angular/core': optional: true @@ -325,46 +343,47 @@ packages: vitest: optional: true - '@angular/cdk@22.1.4': - resolution: {integrity: sha512-//KICh/rxeLbYLgNj8HawaliVAPNlSV0aRmki45Tf/YhoXVhzon9DfFqCs5u1cLvmMkMTHdFm5ghGTB8SUv3DA==} + '@angular/cdk@22.2.0': + resolution: {integrity: sha512-Vxiqo03yKxzmON+hfa0UkUSC+TrWdtRgc1MtkE5l3NJQ5euF9Os4kOqDfW1nDt3/AjCplE64HX3h0gOK5m3zjw==} peerDependencies: '@angular/common': ^22.0.0 || ^23.0.0 '@angular/core': ^22.0.0 || ^23.0.0 + '@angular/forms': ^22.0.0 || ^23.0.0 '@angular/platform-browser': ^22.0.0 || ^23.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/cli@22.1.6': - resolution: {integrity: sha512-HT3OzYkSpCyXMTgD5G1tsS7vkrY8cYJ/JgSjRjrpwOAooSMtKF1hv7BgBcn79sKg4eaiPLrDpQLXP93vHxgSFg==} + '@angular/cli@22.2.0': + resolution: {integrity: sha512-FW4RCNXaPpbBcS4w6fetTO6eRT0xySYGSdQ2DGREU30G1TBnpJdJ6TAvs8mTBPXNfFMQTyioR2ie7UkJljLJKg==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@22.1.3': - resolution: {integrity: sha512-QtMkjhiRd0EnmKR50bw3WbCWYTi6CmA72nnSz1BLQPpaLSi2goloCrPPniHz8fP+w2ESrmmlOWxs1Da3COgnQg==} + '@angular/common@22.2.0': + resolution: {integrity: sha512-BUKkncKwnaEcF/qatBOpzSIx2NthFZLYlTcE7iHwwsw+XQrwB9hU8Ca/l5HqaTJiMg0D8MjI/SWHnD4LFtNN+w==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/core': 22.1.3 + '@angular/core': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.1.3': - resolution: {integrity: sha512-37lLaDp0RHWZ/lmJqCmIEr0HOM2D5ulHy61gqTBm7KRj3Y6ZaxR8B/JqZmeIpPzKFILVsga+NQ4A8apBUkmezw==} + '@angular/compiler-cli@22.2.0': + resolution: {integrity: sha512-xDOvPlNv+RT7sE01wjuGFRMc5SDxWs3RZpGfO5NoI3a0jxM87UW49HmmgwQ6PaU0fya9mttNkHufhfOAbh0ZKQ==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.1.3 + '@angular/compiler': 22.2.0 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.1.3': - resolution: {integrity: sha512-L8Mw2r7bGG/obqgQC+RU3mdFJ3NtLgO5gWhEC1ylcHpLCMPIAXYsMKJIL8dnS78S1wXo/omXwmJ4FiIlCwWahg==} + '@angular/compiler@22.2.0': + resolution: {integrity: sha512-bnqql/HfhnhDXoS7isNaXJAsbKYszcH+nFVWA6YhiAVZhqo3f+XoQb30qeqNtEOKuuC7SZfaAJ3jBkAvyC5CKg==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} - '@angular/core@22.1.3': - resolution: {integrity: sha512-313+Xkf970AmStJE0E/zNJW/9xvDExQG+6TNltBBl+KJsW0q5dffK2w2PQfV4mtTquBqYoeHSRsms4WgjBKL8g==} + '@angular/core@22.2.0': + resolution: {integrity: sha512-VhAgJ4GCdGgAy9+zADpSyEM9gt4pKg6+cqNeK3RBNeF3M3B8y7AWfD/nYRdM3Xzi152Pu+ipgFFNHpupCLTsvQ==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/compiler': 22.1.3 + '@angular/compiler': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -373,41 +392,41 @@ packages: zone.js: optional: true - '@angular/forms@22.1.3': - resolution: {integrity: sha512-b4ual9pgfNqcnEHord50w960DDFIytG3Qb3bu2aCgzmagvRlg9wrtwQNqY+oqY2FVq7c9McNUN7MZRcWl9HNdQ==} + '@angular/forms@22.2.0': + resolution: {integrity: sha512-Nm8o1uBk31EuQGzsK5EunNBVFzTN9MuTYLSrmg1SCPTcava4qK3AzSpl1+Put+cZTTnGtEBIy45AFaxHR2oryg==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 22.1.3 - '@angular/core': 22.1.3 - '@angular/platform-browser': 22.1.3 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 + '@angular/platform-browser': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@22.1.3': - resolution: {integrity: sha512-/u0nCz2AY+RXB4HUdw3Y7C/ZiierPPmUuWR/nDPCylHwllVdMKpi6PPtKvfzgM5ZvaISzDghTVykOVjU7obMhg==} + '@angular/localize@22.2.0': + resolution: {integrity: sha512-RfaF5tAKWyQwGzu0P5bJUavB8QWrWdM/xU5gDXydIFopBk4WERaMYh5E5fGm39h09dod2vmFH3JND1Ht0Vgy6w==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.1.3 - '@angular/compiler-cli': 22.1.3 + '@angular/compiler': 22.2.0 + '@angular/compiler-cli': 22.2.0 - '@angular/platform-browser@22.1.3': - resolution: {integrity: sha512-A8McE6AclwZa2ese4jMfZZu+qZfBFQ4Hl6CaMpzJ1C6Vv6+sXkLu9pouTosJEsUE+etVdepDsqau90lhzgw3Eg==} + '@angular/platform-browser@22.2.0': + resolution: {integrity: sha512-XMUOyn8WARk9NdFGO3uRgdC3hPrp+2xsSYNeSkaEZ4jI3Pc23f22e4GI8Vayl/UOmShHVn/i+NWfTWh3SEbbSw==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/animations': 22.1.3 - '@angular/common': 22.1.3 - '@angular/core': 22.1.3 + '@angular/animations': 22.2.0 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@22.1.3': - resolution: {integrity: sha512-23owvZKCpdL7Yh3EzBj4OLf3x0z+jT9b57Qk96wdwI8Lsyf9L78/RJPYCutJ5r+zq3pFM/BHVKyd+2hkfH7N6Q==} + '@angular/router@22.2.0': + resolution: {integrity: sha512-+pxHMwWWKg+ejS1vKa+tS91CDusCIK1MOSy6fVLc89McMOY/C8tsLrh1uJaMjklejsz+3XUhJgrLOvl3ISNz6w==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 22.1.3 - '@angular/core': 22.1.3 - '@angular/platform-browser': 22.1.3 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 + '@angular/platform-browser': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@3.2.0': @@ -417,16 +436,16 @@ packages: resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/code-frame@8.0.0': - resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + '@babel/code-frame@8.0.6': + resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/compat-data@7.29.7': resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@8.0.0': - resolution: {integrity: sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==} + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/core@7.29.7': @@ -437,32 +456,32 @@ packages: resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/core@8.0.5': + resolution: {integrity: sha512-2/oWkgTbBYoqioCWAE4XJobOrzwxTDa5/XjDP3tJ1BhDr/owcd9qnXBp4xc3/2G5X4bvXM04nrxbRJxFcXAxFQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@7.29.8': resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/generator@8.0.0': - resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-annotate-as-pure@8.0.0': - resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + '@babel/generator@8.0.6': + resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@8.0.0': - resolution: {integrity: sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==} + '@babel/helper-compilation-targets@8.0.6': + resolution: {integrity: sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@8.0.0': - resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + '@babel/helper-globals@8.0.6': + resolution: {integrity: sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-module-imports@7.29.7': @@ -479,24 +498,20 @@ packages: resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0': - resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.4': - resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-option@7.29.7': @@ -511,8 +526,8 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/helpers@8.0.0': - resolution: {integrity: sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==} + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/parser@7.29.8': @@ -520,8 +535,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.4': - resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + '@babel/parser@8.0.6': + resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} engines: {node: ^22.18.0 || >=24.11.0} hasBin: true @@ -628,21 +643,30 @@ packages: resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/traverse@8.0.4': - resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} + '@babel/traverse@8.0.6': + resolution: {integrity: sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/types@7.29.8': resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.4': - resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} engines: {node: ^22.18.0 || >=24.11.0} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bufbuild/protobuf@2.15.0': + resolution: {integrity: sha512-DAheWUkVr/SJTWCc+lg9dhY0eN4SaWlf4+bG1KzHeXbnqt0AfB/NX0Z+VunGlM1ki1B4zVvye27MpKh/svySUA==} + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -682,27 +706,12 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - - '@emnapi/core@1.11.2': - resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} - '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - - '@emnapi/runtime@1.11.2': - resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} - '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -885,19 +894,13 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} - '@hono/node-server@2.1.1': - resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} - engines: {node: '>=20'} - peerDependencies: - hono: ^4 - '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -918,12 +921,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@2.0.7': - resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + '@inquirer/ansi@2.0.8': + resolution: {integrity: sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@5.2.2': - resolution: {integrity: sha512-Y5/bAScMy5Y+9isCx0SKbyJebMCaXXX5em0kxkj115eZNscgV9srOHrgyfS0e5xAVymIfOh9piYBKDILktsMMg==} + '@inquirer/checkbox@5.2.5': + resolution: {integrity: sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -931,8 +934,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.1.1': - resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + '@inquirer/confirm@6.3.2': + resolution: {integrity: sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -940,8 +943,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.2.0': - resolution: {integrity: sha512-SKXarWrYhtpqOEctf9XGCGy29QjsvJAM0Aq9ZR9z4Ns94OmpqudOly+aSEfNqUf9SwsQaUgY9+Z8hyzG0xX8fw==} + '@inquirer/core@12.0.3': + resolution: {integrity: sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -949,8 +952,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.2.1': - resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + '@inquirer/editor@5.3.3': + resolution: {integrity: sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -958,8 +961,8 @@ packages: '@types/node': optional: true - '@inquirer/core@12.0.0': - resolution: {integrity: sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==} + '@inquirer/expand@5.1.5': + resolution: {integrity: sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -967,8 +970,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.3.0': - resolution: {integrity: sha512-nnsP/IdJ8s83q7ZuObmgn12QM+uLCkab9E0Oordojbn62WUg1c+v9Ou/F/057pgh0ppX0W+Hj5bO/Dp5hsxQtA==} + '@inquirer/external-editor@3.0.5': + resolution: {integrity: sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -976,8 +979,12 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.1.2': - resolution: {integrity: sha512-OWIH1IyyWqEKIyqC9Xy+Bnga7NkGMovFdo4atYZMUOTRqf6rO2WCv9E/1MyzvOErDBCxs+9UFliRUDc50xs/jw==} + '@inquirer/figures@2.0.9': + resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/input@5.1.6': + resolution: {integrity: sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -985,8 +992,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@3.0.4': - resolution: {integrity: sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==} + '@inquirer/number@4.2.3': + resolution: {integrity: sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -994,12 +1001,8 @@ packages: '@types/node': optional: true - '@inquirer/figures@2.0.8': - resolution: {integrity: sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - - '@inquirer/input@5.1.3': - resolution: {integrity: sha512-F/BZHtyEzP+HO+IGVd4AjBRgvX/ywm42bx8S0+dENk2YclzE9tJ3X/15THwtT6ehApmKvdYDMsVTuyyDod0gOQ==} + '@inquirer/password@5.2.2': + resolution: {integrity: sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1007,8 +1010,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.2.0': - resolution: {integrity: sha512-ew+fSDijsQ/WhD4TV3XLb+if400cDuzTzHfGR8sTNBXkK9CYDWoGE8fhaO8GbT312pNv1AJEOsDxy/z/HVettA==} + '@inquirer/prompts@8.7.2': + resolution: {integrity: sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1016,8 +1019,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.1.2': - resolution: {integrity: sha512-nSdufycW8xynEVssFkNQEYIzTySilog0UlfOVRwh3pXzPSk4frXUT2jZWjHnKae6RU9PaoF9wfy1pGwewQuqGw==} + '@inquirer/rawlist@5.3.5': + resolution: {integrity: sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1025,8 +1028,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.5.2': - resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + '@inquirer/search@4.3.3': + resolution: {integrity: sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1034,8 +1037,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.3.2': - resolution: {integrity: sha512-oPSKrYK1X1bMkjXDzIKHUkJp195LFSfgbnVtXnjSKGFjrCbS6I+wyvfAZTwKE9BSt3HwWgfD7JfsXALBgCogzQ==} + '@inquirer/select@5.2.5': + resolution: {integrity: sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1043,26 +1046,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.3.0': - resolution: {integrity: sha512-HFxXE5w727ctSUcAwrDquftJGjMgu36OeV5SHEXMlr2j/ahzmRX9xSEeVolV8tzYnTf45cg6vGkdMMRdm3RPhQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/select@5.2.2': - resolution: {integrity: sha512-RkI8dRHWt+bh04oLixvF1kFzKC7e5rqJoHKkzcqSHATebBXFC6GmrT8ddbVkgSzLV0HnHs2cPFuBINr8otij8Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/type@4.0.7': - resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + '@inquirer/type@4.1.1': + resolution: {integrity: sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -1082,12 +1067,12 @@ packages: resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} - '@jest/console@30.4.1': - resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} + '@jest/console@30.5.2': + resolution: {integrity: sha512-e8sQC4pCMHPBrPX7Hk8TJr+DM5dkUnImSTNag8SEWFAFAF6xIz4AJvCKapnrdHnZxep4bxw4PhG+ZbimYBMyKw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.4.2': - resolution: {integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==} + '@jest/core@30.5.2': + resolution: {integrity: sha512-/jqvFWoJF7LV1a6AUpYMbMm+2yIYsHJfR474H0SCzr9k8tnO/jl9wRg6zSG6lxgf6EozNlCG4amFzWsbZSvvZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1099,6 +1084,10 @@ packages: resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.5.0': + resolution: {integrity: sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.4.1': resolution: {integrity: sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1109,36 +1098,67 @@ packages: canvas: optional: true + '@jest/environment-jsdom-abstract@30.5.2': + resolution: {integrity: sha512-8/P+8hKv7L4mhFoB6gpYLj/fuzXk8PWrde7TDHh8tJz5pE1ktlMbg0y6hDY/V8MfAnispFlPl/vPifowLy3JGQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/jsdom': '*' + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true + '@jest/environment@30.4.1': resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.5.2': + resolution: {integrity: sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.4.1': resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.4.1': - resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} + '@jest/expect-utils@30.5.2': + resolution: {integrity: sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.5.2': + resolution: {integrity: sha512-2E+1Pg6jJxbRjLNLpciC71iri/3qsKJL222/aXJEFwC0VdUSvfS+JZQQLEVjUYYc8t8pQu2MGE3cF2+bNTYRsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/fake-timers@30.4.1': resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.5.2': + resolution: {integrity: sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.4.1': - resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} + '@jest/get-type@30.5.0': + resolution: {integrity: sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.5.2': + resolution: {integrity: sha512-62zfS+dL+M5aTNHXCNLyqD+j4oqxTIzDYrZbpqMP8Yn+gvlAGyzC6BSPNb1ZmFOakV1RtFYX/O3FCQXSWmQdgg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.4.0': resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.4.1': - resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} + '@jest/pattern@30.5.0': + resolution: {integrity: sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.5.2': + resolution: {integrity: sha512-ev6E9iG73twQcfAfoTnviuYkr3yOrYbzAtMFCimv2fxHXPIp9PBt2u1wNMt0aYWgl8FPwIcS8oqRJg6alnht4Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1154,33 +1174,44 @@ packages: resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.4.1': - resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} + '@jest/schemas@30.5.0': + resolution: {integrity: sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@30.0.1': - resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + '@jest/snapshot-utils@30.5.1': + resolution: {integrity: sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.4.1': - resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} + '@jest/source-map@30.5.2': + resolution: {integrity: sha512-c5CehvkbfHX6yyNg7bMn2ylqlp9AHXuZ/3hPH/Lh5bxD/vefd/lV9HBjMqXef9yQNqkdwyZvkLSVSwB38hy8Qw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.4.1': - resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} + '@jest/test-result@30.5.2': + resolution: {integrity: sha512-eO6YU5rsLfs60ne694e0IAmRgeBnoA8mu0nlxXDbl/1j5km0o2vO9/VbbUIKIH+WRKKEI+ELgwraRGn2Lhep8g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.4.1': - resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} + '@jest/test-sequencer@30.5.2': + resolution: {integrity: sha512-bmij8jZyYAC47ExT2GeP7PcrlwSNS+Bp3KeRuBH88gpcxqDv6fljN8PemS4J/lLZ79xb6mpaennQTTq0zUAVVg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.5.2': + resolution: {integrity: sha512-LBGwmaE886C41jDZ65eqR1YbXM7642MK3ZhTowZd5+xDlrDLuf4ePuDdDmVSvcr8NTVJ3MqxLkMbUCzuigUaoQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@30.4.1': resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.5.1': + resolution: {integrity: sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1188,8 +1219,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1197,12 +1228,21 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@listr2/prompt-adapter-inquirer@4.2.5': - resolution: {integrity: sha512-pYGy9dTdTwXdasPgyohkr0HoQ4FrkAzFnsUZl/gcnadDArbpZ8e+fgr+F9WBdNEl2y00mb9bCM4WgmoBkZJ27A==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@listr2/prompt-adapter-inquirer@4.2.7': + resolution: {integrity: sha512-k180vxSv2KqmnDxoato6pCqEJsov4U5C0EVmldZkAdNeVBxY48A/LM6TCNPGIzDK/iZSfsZP0Mw+gbWc5hXLyA==} engines: {node: '>=22.13.0'} peerDependencies: '@inquirer/prompts': '>= 3 < 9' - listr2: 11.0.0 + listr2: 11.1.0 '@lmdb/lmdb-darwin-arm64@3.5.6': resolution: {integrity: sha512-mY5FG4TjPAkY4P0w+OhHaUka5mDh2TX2WKYIwuKzJ1zeW3VvRgxdam/lGJTquI+bthTx5CSHDW+BAQCnNAzkEA==} @@ -1239,14 +1279,13 @@ packages: cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.30.0': - resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true + '@modelcontextprotocol/core@2.0.0': + resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + engines: {node: '>=20'} + + '@modelcontextprotocol/server@2.0.0': + resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} + engines: {node: '>=20'} '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} @@ -1278,79 +1317,79 @@ packages: cpu: [x64] os: [win32] - '@napi-rs/canvas-android-arm64@1.0.5': - resolution: {integrity: sha512-ZzDlpKQocwFfCwhMh17UWre6Qt5yZN3kNIJoUpGfRZqwDDZ164IKOsPOHsRd3d8Tuj5KM6bDjGuPmZxuPuG3NQ==} + '@napi-rs/canvas-android-arm64@1.0.9': + resolution: {integrity: sha512-4LGXk2/0HVzE29K8SzML5WubgCp++B1FH3qgl35XmSZE+lLdr6P9VRQEnZ0MCLZMTSuJP41yyhtoiVNEuvrTIA==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/canvas-darwin-arm64@1.0.5': - resolution: {integrity: sha512-Hr8v6CA/TBe+OJOePdV3sXWxzQHQKfQsTKPbc8wG7iPqVeAx6MMdzKGXlYID6SVvpfwV/zqkvGcdImYWSlhrZg==} + '@napi-rs/canvas-darwin-arm64@1.0.9': + resolution: {integrity: sha512-YNdfLBzY0W/Pep9fo2L6RmoNlNksnn05LRnX66W63R3ij58S25QOTcjdtEt2v8+PnCESzqZsYzUo+QPeIR44NA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/canvas-darwin-x64@1.0.5': - resolution: {integrity: sha512-9BXlLHBXpYnK4jSae1MdFdyPq09Xi1I3PeCNpvRzqgmUUBhgJS7aC1z7SZEP8JUXDHtbfIrolCS3sFuT9IGP2A==} + '@napi-rs/canvas-darwin-x64@1.0.9': + resolution: {integrity: sha512-ceZQSknTEcy3dOXoekv59LTCkXjvnLsq+VW5PeNNDHEPQbRS5Ervkm1EaDa7WLAjiYWMLuSQTRTHao1dEX4prg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/canvas-linux-arm-gnueabihf@1.0.5': - resolution: {integrity: sha512-zEW4fgvtYsOJ/N56Us4TQPfaFrUf0shGr9CgGSj3GACc+NHfUM3ci0YF9xFTjwJWGDmaEhYPL6KqCfFCxwm/qg==} + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.9': + resolution: {integrity: sha512-XhfI0Wwv4llhd6nnWDtY3kQKjq0r+y1i91PlJlJI24ag2U9WrnwbG1qS3+fDLEyouwEVFchiKkTEHozK+5iUNA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/canvas-linux-arm64-gnu@1.0.5': - resolution: {integrity: sha512-HFprwLspelJxCEtZvdMcz95Mwvfs63GzFVedLFmC/wslHnaOXhjXxgYxPCM/VdM4Jhx3CV4Lk0vVmh6hJv2etQ==} + '@napi-rs/canvas-linux-arm64-gnu@1.0.9': + resolution: {integrity: sha512-012oiYtKaE7i9oxc8q7nraT7kDOpLcaCmFLzVe9Ty34RHDdoDzbWLrVh827CNxYh/EADX1eSikA3ymLjo/nNuw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-arm64-musl@1.0.5': - resolution: {integrity: sha512-FNMGFAx8DvtDwlLfWyBJ+oQjgPXoIAqCnNTJYqtJCFRwwzK3AyAe5B1Ll3NZ6hcOzqw7HylZsq4nQxVyPCQX1Q==} + '@napi-rs/canvas-linux-arm64-musl@1.0.9': + resolution: {integrity: sha512-Ls5UWYFFn63casTZEczbeyEg3vRDRkv9lscuGwfchtY5yLLQhgOB8SN4YGxmfJ5vTaBwZ2YUxBS3NtmjJmFXdA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@napi-rs/canvas-linux-riscv64-gnu@1.0.5': - resolution: {integrity: sha512-2vd5v8Lui+37Hh/spITKIvTT384ip4dnUc5XBn0E+sMNS4b7au7IswyT5YDG2udPTjSh/eLUs3sGuB5YHooFOA==} + '@napi-rs/canvas-linux-riscv64-gnu@1.0.9': + resolution: {integrity: sha512-hLKEGxV7ZiRHqndePTokgDMdBlo/rDfzg7P4p4QIv9pUhuYobnu3R2NIFLCRghG0nwfo+s2sw+c1xZFeCmEAsw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-gnu@1.0.5': - resolution: {integrity: sha512-iQIPy+Uey0expZTOszLri5n8rY7x4WUpMaY82mcXNIgbil30iHvc01OsiizhZC1KQHTK90RFMFWSpwFU+ON3aA==} + '@napi-rs/canvas-linux-x64-gnu@1.0.9': + resolution: {integrity: sha512-6kaz3w0QMy77PDWk6rJ1ksIihdad3qzEyX2o2oGT8GwCaypfT5mhjr8buOO5hstyLxcWXDScuz56RsINLtBPIQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-musl@1.0.5': - resolution: {integrity: sha512-Npthji25t7FUqIAKsoEkFS0qY5CYVkHjvI3tuZjDTG92wX8g4dst+Lfb4hhubdqPazlDcIwalPzInsFCtf3FFg==} + '@napi-rs/canvas-linux-x64-musl@1.0.9': + resolution: {integrity: sha512-xrGvmS3v55hmZ86ls/kBLVNMUTYio3f6Ik0DireemG994VfPAwiA3ZXA0Uf1bByctkB3NQ1Sfb+H5bkdUnnzfQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@napi-rs/canvas-win32-arm64-msvc@1.0.5': - resolution: {integrity: sha512-bi+JsdCdbfVJDoAQybTYmkLKwh1xpYpptg5j/BNr2BB56u4/R26jrVvtjqff+CxYMXV6Kz1/jeDVhZCuj6bDng==} + '@napi-rs/canvas-win32-arm64-msvc@1.0.9': + resolution: {integrity: sha512-yjmVS3ArZeRVCP7jqbPq4rpZa/BhTeI7ELE2XqJg3snICQBDevLZyArxswHkiTnT34KRic33/4fLirrHI+SY8A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/canvas-win32-x64-msvc@1.0.5': - resolution: {integrity: sha512-KQQwG9/sBmcGxqaLFIQf+k2OefREGoyEaIBmRuTM8bUuFKOEE9Xk5pel90hE6pmBwk/vo4RB0OdX+FxobJGMFw==} + '@napi-rs/canvas-win32-x64-msvc@1.0.9': + resolution: {integrity: sha512-QlSYQdMQslB81nlABo9wNfQ6npFhE7/O+saCZdqVGueGanyRk4jCogD5EwQenfP3kIq9e+mm6GreQBjX5MrA8g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/canvas@1.0.5': - resolution: {integrity: sha512-GaPlicMtnvgPr5SowFRprkEJicDSrV3qCq17U4jiF5u0kNORZo3IbdN2Bk4SfcZJAMYFHbMVJ81O3w21CYxazg==} + '@napi-rs/canvas@1.0.9': + resolution: {integrity: sha512-QviPdJImDi/jMAvBfqaw+19BndMd/sizXVW3NnpMd3VJGz++QXkOHcP9kWR/smHG0hNjHeyuHFyrx/5lD0oNcQ==} engines: {node: '>= 10'} '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -1466,15 +1505,8 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.2.2': - resolution: {integrity: sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 - - '@napi-rs/wasm-runtime@1.2.3': - resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 @@ -1490,8 +1522,8 @@ packages: '@popperjs/core': ^2.11.8 rxjs: ^6.5.3 || ^7.4.0 - '@ng-select/ng-select@24.0.2': - resolution: {integrity: sha512-EcOQanLp5dNxkDOxK75z7+B3gZW8LvQofzwL5AgWUn04EkJOXRI7Wi6Ylp7+jIAi9yPsTwjznrRd+wSl9EZGAQ==} + '@ng-select/ng-select@24.1.2': + resolution: {integrity: sha512-+1RlW4v/Nwo5hrPxnjLebC8necpb3x+peIPnSjDZfVEDNpi+PNjcvSXhM0ZTxzli2n5kYoAetlKRW/xu1ai4KA==} engines: {node: ^22.12.0 || ^24.0.0 || ^26.0.0} peerDependencies: '@angular/cdk': ^22.0.0 @@ -1508,141 +1540,133 @@ packages: lodash-es: '>=4.17.0' rxjs: '>=6.0.0' - '@oxc-parser/binding-android-arm-eabi@0.142.0': - resolution: {integrity: sha512-ZiRGDutGsv1G6bL/ozy/koC0Sv39T1DqyoC4KD1DOy9ZoACm1O5UWhEK2c02Qdk+4lfLVkvFa/mQ0fm/4h1BtQ==} + '@oxc-parser/binding-android-arm-eabi@0.150.0': + resolution: {integrity: sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.142.0': - resolution: {integrity: sha512-WZkvGRLNQTz8lR9zP5nLjUdlroRCopBu3g9zF1p/laE6DzT1UbQo8Rdz5MWhaJUPYg/6gp+jo7HUgsyKaN1FtQ==} + '@oxc-parser/binding-android-arm64@0.150.0': + resolution: {integrity: sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.142.0': - resolution: {integrity: sha512-l4khS8LQOOVYsGRVARo1gSaCT/aBSceUVXgtovWc2+drnxVuDr082WA3OCHVdVzIz5JIrP/y9CWsSKxBDNmYGg==} + '@oxc-parser/binding-darwin-arm64@0.150.0': + resolution: {integrity: sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.142.0': - resolution: {integrity: sha512-QBsNF3nqlXmcH2B1YOPqQYmCJoy4HuIjUxGbBO/k5JAJUl68ghU2psRY2zPk+RyBaWqKP/qfL4oaFgEMCdwskA==} + '@oxc-parser/binding-darwin-x64@0.150.0': + resolution: {integrity: sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.142.0': - resolution: {integrity: sha512-b7Q7m4Cqc6XqNhri3R+QhU+GVy646Pn+bkdhrDdWym/Fdi0ZUa+d73H9dm5H91JtbtAQ/z1d8XKMW3oOV8a4tQ==} + '@oxc-parser/binding-freebsd-x64@0.150.0': + resolution: {integrity: sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.142.0': - resolution: {integrity: sha512-3riVS5IhdH3uCZj1Y9ftDQlR0dvLsIlw/edrRqk8JhgNd5K0XSs+UBtgh50N13CAlW9/TXj6sVGXaKNBocd0Yg==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': + resolution: {integrity: sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.142.0': - resolution: {integrity: sha512-NmXUOpgpTSkhl795TiXmWppTwmSJ92RC1qvD6e4XOF+slgmo3e6Ah+kEu+6AN8s7NAOEwqGmir58MgSQSWmBSA==} + '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': + resolution: {integrity: sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.142.0': - resolution: {integrity: sha512-gc0EXsKtXgerujmU2Bql3u1L1HsSQ2774R83idq/FoNMPVV/RY/1ErFsvnit7KoiP/sLvzQixeUo4Ut0ic0wmw==} + '@oxc-parser/binding-linux-arm64-gnu@0.150.0': + resolution: {integrity: sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.142.0': - resolution: {integrity: sha512-F2XvmWSE0uWpie+jHKKIFgdVOe9ypGhkEZxKx5DuW215K6cbAC274yYaPkcM7EqY4Df3Weyhpcz3lsURyH2LVg==} + '@oxc-parser/binding-linux-arm64-musl@0.150.0': + resolution: {integrity: sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.142.0': - resolution: {integrity: sha512-wLMbT21U/QxknQsk+VvNF0b9D2/aGWhcaQQQ+VYlE8FwD5+GoWZIPPXNzyHmkYyhm0KB3itL+TBavjMatqNnYA==} + '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': + resolution: {integrity: sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.142.0': - resolution: {integrity: sha512-+G8F/4ckwT7FCJV4H2bt09xEzJbjNCfuL4Sp1AYNaFtFMVtgIGMuJlteT82U+K0UIZ/DzAR/LDlMFnEuajG7Kw==} + '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': + resolution: {integrity: sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.142.0': - resolution: {integrity: sha512-hTsHtTLxMAfCo+rpF5K3qZJKW2NpPN/CHd4mYB3y7XlSdspHkd2gehDIofP64AacA9nWQw2tY3O7wR6UY8IVOA==} + '@oxc-parser/binding-linux-riscv64-musl@0.150.0': + resolution: {integrity: sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.142.0': - resolution: {integrity: sha512-6y7qYY3TCUDYjqswImdTGl92y+KA/80twALegQPN27kfY+bG7Ib1+L3jbmrCZQx6wrVnai9IPsEZp07I0hx7JQ==} + '@oxc-parser/binding-linux-s390x-gnu@0.150.0': + resolution: {integrity: sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.142.0': - resolution: {integrity: sha512-i69kAWU+2LgoH5bR+zWiiu+UzAw7Oxkwv7COeJTeY19pn4e70nKQcr9Pm6cL2Z0Z54d+gl9qADlK/0yyuCPiBA==} + '@oxc-parser/binding-linux-x64-gnu@0.150.0': + resolution: {integrity: sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.142.0': - resolution: {integrity: sha512-4SQs678MmjYVrmhAgCWD4o0vpaFszXw9xLX5p2Z9MMFcltxiLkA88wQjh80YHjPrXtpyZ2CWI5m+1yNKM0m2Pw==} + '@oxc-parser/binding-linux-x64-musl@0.150.0': + resolution: {integrity: sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.142.0': - resolution: {integrity: sha512-YHpx9N7Ln3a++Tc8rv+H7mrK1zyJQOAwCFg8LZ3lTs1T5afGWeZrLPhPT9HLnIwSjCyJqPWVMIrMxbjcmBr2oQ==} + '@oxc-parser/binding-openharmony-arm64@0.150.0': + resolution: {integrity: sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.142.0': - resolution: {integrity: sha512-3pLDyY3+oogW73RM5uehNgAiR/Xfb7fvO2Q1Z1gIqZ2+50XDVQmBVlRkHXZTU4gKnQHpwETNsYQVsJ3joVB2iA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@oxc-parser/binding-win32-arm64-msvc@0.142.0': - resolution: {integrity: sha512-Had/VeVY28Oyb0K+Q4FV8KCzoBycIh93oDK6pCbya9lkzdq+ikMHMgBubsdqqlybjJmQRawCQRrnBRHyQwYvcQ==} + '@oxc-parser/binding-win32-arm64-msvc@0.150.0': + resolution: {integrity: sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.142.0': - resolution: {integrity: sha512-GGi3+YphVHavvgs6gum2UXoNCqzHAmPt/nXkn8ZQZstV2Q1qZD1Mn8fz/nWrDkefHQtrG/+1/XrbMxsBTo6Svw==} + '@oxc-parser/binding-win32-ia32-msvc@0.150.0': + resolution: {integrity: sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.142.0': - resolution: {integrity: sha512-Ny/Wv4Us1LGC/ljwNTp+Hx3r/pH15EFfeDF0p+n898gt+TtRd6C9SccHcuUhDiNTb8s5tt7jdeAMDRQZ4Vq6hg==} + '@oxc-parser/binding-win32-x64-msvc@0.150.0': + resolution: {integrity: sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.139.0': - resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@oxc-project/types@0.149.0': + resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==} - '@oxc-project/types@0.140.0': - resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} - - '@oxc-project/types@0.142.0': - resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} + '@oxc-project/types@0.150.0': + resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} '@parcel/watcher-android-arm64@2.6.0': resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} @@ -1742,192 +1766,98 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@rolldown/binding-android-arm64@1.1.5': - resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + '@rolldown/binding-android-arm-eabi@1.2.8': + resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.8': + resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.2.0': - resolution: {integrity: sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.1.5': - resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + '@rolldown/binding-darwin-arm64@1.2.8': + resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.0': - resolution: {integrity: sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.1.5': - resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + '@rolldown/binding-darwin-x64@1.2.8': + resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.0': - resolution: {integrity: sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.1.5': - resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + '@rolldown/binding-freebsd-x64@1.2.8': + resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.0': - resolution: {integrity: sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': - resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.0': - resolution: {integrity: sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.1.5': - resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + '@rolldown/binding-linux-arm64-gnu@1.2.8': + resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.0': - resolution: {integrity: sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.1.5': - resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + '@rolldown/binding-linux-arm64-musl@1.2.8': + resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.0': - resolution: {integrity: sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.0': - resolution: {integrity: sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.1.5': - resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + '@rolldown/binding-linux-s390x-gnu@1.2.8': + resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.0': - resolution: {integrity: sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.1.5': - resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + '@rolldown/binding-linux-x64-gnu@1.2.8': + resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.0': - resolution: {integrity: sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.1.5': - resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + '@rolldown/binding-linux-x64-musl@1.2.8': + resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.0': - resolution: {integrity: sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.1.5': - resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + '@rolldown/binding-openharmony-arm64@1.2.8': + resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.0': - resolution: {integrity: sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.1.5': - resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-wasm32-wasi@1.2.0': - resolution: {integrity: sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.1.5': - resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + '@rolldown/binding-win32-arm64-msvc@1.2.8': + resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.0': - resolution: {integrity: sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.1.5': - resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.2.0': - resolution: {integrity: sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==} + '@rolldown/binding-win32-x64-msvc@1.2.8': + resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1939,8 +1869,12 @@ packages: resolution: {integrity: sha512-5f5f0tKp3d25hjNGkvw2dtGgTN4wxPNhv1AXnhFkh+mLinQK9Qwzr2iEXDDrAuJEkvz1ACHq631IURWph0lqew==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@schematics/angular@22.1.6': - resolution: {integrity: sha512-RiD4OZJ4yuaM1aXb3pt1gjDSWwkP0jrgiCuoaBls1eabcrDmlsNuQv0ekxbcGgCRPdSJvmHRZIHHmFPzei8w3Q==} + '@schematics/angular@22.1.8': + resolution: {integrity: sha512-V37T9uHOQVHyxxOqwcJ9xjSIW/mW9UuSfjOc7WJE4V8+3zj0abDJLHuoxDZKe0icYGapgOcvHyYjtNOjSeSivw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@schematics/angular@22.2.0': + resolution: {integrity: sha512-IOD+T+S5LyVVuLAtLq/5k+WxnT9UpJecyDPvIT+AWug+mZJkd+HKVVHryenNJBaW29tIxNfoDuVFPEsZ4UKcNw==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@sinclair/typebox@0.27.12': @@ -2015,8 +1949,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@26.4.0': - resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} + '@types/node@26.6.2': + resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -2030,63 +1964,63 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.68.0': - resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} + '@typescript-eslint/eslint-plugin@8.70.1': + resolution: {integrity: sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.68.0 + '@typescript-eslint/parser': ^8.70.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.68.0': - resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} + '@typescript-eslint/parser@8.70.1': + resolution: {integrity: sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.68.0': - resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==} + '@typescript-eslint/project-service@8.70.1': + resolution: {integrity: sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.68.0': - resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} + '@typescript-eslint/scope-manager@8.70.1': + resolution: {integrity: sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.68.0': - resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} + '@typescript-eslint/tsconfig-utils@8.70.1': + resolution: {integrity: sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.68.0': - resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} + '@typescript-eslint/type-utils@8.70.1': + resolution: {integrity: sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.68.0': - resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} + '@typescript-eslint/types@8.70.1': + resolution: {integrity: sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.68.0': - resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} + '@typescript-eslint/typescript-estree@8.70.1': + resolution: {integrity: sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.68.0': - resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} + '@typescript-eslint/utils@8.70.1': + resolution: {integrity: sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.68.0': - resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} + '@typescript-eslint/visitor-keys@8.70.1': + resolution: {integrity: sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.3': @@ -2218,10 +2152,6 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2299,18 +2229,18 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-jest@30.4.1: - resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} + babel-jest@30.5.2: + resolution: {integrity: sha512-ES8WeJ2fNWPEDunyAtUfJ12nHyaWUloCHdkfK2oW5uSoQSUmjNKdWiGaXJITJwvFEWoD/evHEg/QoCXAvLaQqQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-0 - babel-plugin-istanbul@7.0.1: - resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} - engines: {node: '>=12'} + babel-plugin-istanbul@8.0.0: + resolution: {integrity: sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==} + engines: {node: '>=18'} - babel-plugin-jest-hoist@30.4.0: - resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} + babel-plugin-jest-hoist@30.5.0: + resolution: {integrity: sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-preset-current-node-syntax@1.2.0: @@ -2318,11 +2248,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@30.4.0: - resolution: {integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==} + babel-preset-jest@30.5.0: + resolution: {integrity: sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 || ^8.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2331,39 +2261,33 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.11.19: - resolution: {integrity: sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==} + baseline-browser-mapping@2.11.26: + resolution: {integrity: sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==} engines: {node: '>=6.0.0'} hasBin: true - beasties@0.4.3: - resolution: {integrity: sha512-fIIeLOcbAB/K1kb1HBVJoiq1alHL4RCYBSo5e7HzrNkkgMggXR1Vqt/Z9JWnkfe/qdCo66Ux3QRwZioAIBdWRA==} - engines: {node: '>=18.0.0'} + beasties@0.5.4: + resolution: {integrity: sha512-8/lOOjT+PElYCnaUbmhgd3Uad5R1VTQ4Wg0k4rK8bX04m5WEqHNmnlLy3Q/lJ7dk25XA+72gayzc/skTfKKpcA==} + engines: {node: '>=20.19.0'} - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolbase@2.0.0: + resolution: {integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==} + engines: {node: '>=20.19.0'} bootstrap@5.3.8: resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==} peerDependencies: '@popperjs/core': ^2.11.8 - brace-expansion@1.1.18: - resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@2.1.4: resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} - browserslist@4.28.8: - resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + browserslist@4.29.1: + resolution: {integrity: sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2377,17 +2301,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -2401,8 +2316,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001810: - resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} + caniuse-lite@1.0.30001812: + resolution: {integrity: sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -2427,8 +2342,8 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} @@ -2468,20 +2383,8 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - content-type@2.1.0: - resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} - engines: {node: '>=18'} + colorjs.io@0.7.1: + resolution: {integrity: sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==} convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2489,18 +2392,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -2508,12 +2399,13 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + css-select@7.0.0: + resolution: {integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==} + engines: {node: '>=20.19.0'} - css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} - engines: {node: '>= 6'} + css-what@8.0.0: + resolution: {integrity: sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw==} + engines: {node: '>=20.19.0'} cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} @@ -2550,10 +2442,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2570,31 +2458,27 @@ packages: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@3.1.1: + resolution: {integrity: sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==} + engines: {node: '>=20.19.0'} - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domelementtype@3.0.0: + resolution: {integrity: sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==} + engines: {node: '>=20.19.0'} - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@6.0.1: + resolution: {integrity: sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==} + engines: {node: '>=20.19.0'} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + domutils@4.0.2: + resolution: {integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==} + engines: {node: '>=20.19.0'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.415: - resolution: {integrity: sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==} + electron-to-chromium@1.5.439: + resolution: {integrity: sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2609,28 +2493,16 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} engines: {node: '>=20.19.0'} environment@1.1.0: @@ -2640,17 +2512,8 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild-wasm@0.28.2: resolution: {integrity: sha512-GccVwhv3mmOUVQHCQm2Ox/rby8n/EqUwvZxE6Pjfikrq/lWw9g9WX/u9EykWnpot3Ko6j426DgQdea2xWKIAQA==} @@ -2666,9 +2529,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -2689,8 +2549,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.9.1: - resolution: {integrity: sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==} + eslint@10.11.0: + resolution: {integrity: sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2724,18 +2584,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventsource-parser@3.1.1: - resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2748,15 +2596,9 @@ packages: resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - express-rate-limit@8.6.2: - resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + expect@30.5.2: + resolution: {integrity: sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2773,8 +2615,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -2791,17 +2633,12 @@ packages: picomatch: optional: true - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2810,28 +2647,20 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + flru@1.0.2: + resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} + engines: {node: '>=6'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2842,9 +2671,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2853,22 +2679,14 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2885,13 +2703,9 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2905,17 +2719,15 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - hono@4.13.5: - resolution: {integrity: sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==} - engines: {node: '>=16.9.0'} + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} hosted-git-info@10.1.1: resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} @@ -2928,12 +2740,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} + htmlparser2@12.0.0: + resolution: {integrity: sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==} + engines: {node: '>=20.19.0'} http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} @@ -2963,12 +2772,12 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.10: + resolution: {integrity: sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==} engines: {node: '>= 4'} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} engines: {node: '>= 4'} immutable@5.1.9: @@ -2986,21 +2795,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ip-address@10.5.0: - resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -3031,9 +2825,6 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3068,16 +2859,16 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@30.4.1: - resolution: {integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==} + jest-changed-files@30.5.1: + resolution: {integrity: sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.4.2: - resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} + jest-circus@30.5.2: + resolution: {integrity: sha512-vffFgjs5JSJ9q4ds1vNW3klKYPJfYfIY61LT/zaZgvTeASJOWZUt8LBfHgIcV4rwxlPBLl/ePBGccHEclS4PlQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.4.2: - resolution: {integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==} + jest-cli@30.5.2: + resolution: {integrity: sha512-YYYxUUVjFgPvgEleKNKMaYGIFgR3l3832Cl0kRL/oCiDZ03v7wImUtquHl2OOBCCNgprjZgBN5bczS/JklPBDg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3086,8 +2877,8 @@ packages: node-notifier: optional: true - jest-config@30.4.2: - resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} + jest-config@30.5.2: + resolution: {integrity: sha512-U6221OZekabePvGcGPf4raIBKMvYQWFHvhobDJRojOYaFMj2HaGytAdknjDhYc6JTz2fdHW9+6k0wWUDaNeOFQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -3109,16 +2900,20 @@ packages: resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-docblock@30.4.0: - resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} + jest-diff@30.5.2: + resolution: {integrity: sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.4.1: - resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} + jest-docblock@30.5.0: + resolution: {integrity: sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.4.1: - resolution: {integrity: sha512-o3nfaN4zej7qgk2X0j8Jhq/S9nAVKs2xK3QeQxeHVvpkEPxaA1yxDGydR+iVI7zPy7Cp62Aq2h3Ja46QvfWHGA==} + jest-each@30.5.2: + resolution: {integrity: sha512-GRrW+7fmmgmkvyfEBqc1QFdWnF1Ex5yG6Y6AWL4TTxnkWlKIT98dsKh3P3UuWm6v4XsQwVE6DEzXIPMzWJ3ZbA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-jsdom@30.5.2: + resolution: {integrity: sha512-6NOZjEP+WNi4WXjbxb/1ROnfaMxn6Dhqu6uSC22o0H28z+uppejs/jZ9KCVoLepqqoCjcNZujtzQqC9jSV15jg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -3126,46 +2921,49 @@ packages: canvas: optional: true - jest-environment-node@30.4.1: - resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} + jest-environment-node@30.5.2: + resolution: {integrity: sha512-Ciz4KgTGIbojxSKpuFImgWJj5EyqfE8xMq9NxWmOXnQywHHS03H9Mv+vaCB29J5pr3JBrY27WbRV18rBdjh8Dg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.4.1: - resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} + jest-haste-map@30.5.1: + resolution: {integrity: sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-junit@17.0.0: resolution: {integrity: sha512-RYWCkq4j59gUXj5DsgbIE7xFBZzu1gtibPhyjSjMmGaOTLnqlXhg7x9zuGCwgbCuMAyoyvk0Mi8wSrRR5uOeLA==} engines: {node: '>=20.0.0'} - jest-leak-detector@30.4.1: - resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} + jest-leak-detector@30.5.1: + resolution: {integrity: sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.4.1: resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.5.2: + resolution: {integrity: sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.4.1: resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.5.1: + resolution: {integrity: sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.4.1: resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-mock@30.5.2: + resolution: {integrity: sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-preset-angular@17.0.0: resolution: {integrity: sha512-2yAHkA1c5rSICGJVtLYYqPC5RDsvo4+i4CwWFHVXwv41cHNX7gCWeh074IuZ5mFw7Vwsr+i25EowCnGtKkxNWw==} @@ -3182,47 +2980,55 @@ packages: resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.4.2: - resolution: {integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==} + jest-regex-util@30.5.0: + resolution: {integrity: sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.4.1: - resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} + jest-resolve-dependencies@30.5.2: + resolution: {integrity: sha512-GMI0DP5enX9Z2qW2zFy1bOkrCfWAOPRJQ7qHt0pdfrxBPsgWxglMPrRSK2TX/wRWYxcPRSLFg3Z88qPOzHx7FQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.4.2: - resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} + jest-resolve@30.5.1: + resolution: {integrity: sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.4.2: - resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} + jest-runner@30.5.2: + resolution: {integrity: sha512-/B6px7hiiNhVSRwuv9AGn0nawYvwsHeQZ3ItTd5Gp2diFd0EOKaWVeWqcbw3L88vx1GfpCKjQkxWItZCTl11Rw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.4.1: - resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} + jest-runtime@30.5.2: + resolution: {integrity: sha512-0paUAHBlheai10A3XSy9Xh+YBG0IROy+/qzcDPzQ/nbbXrznQzeWy5qniICWK6d3W3scaRQCVAbXdcK0ibBq4w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.5.2: + resolution: {integrity: sha512-jKIdes25AnAH73dOCi2qE6J6vHJ6L2vyBS11M89kT50DVJcLTf2AOjvcc+2vVaN8lUbY5v2R83aqXo3Ro9fqYA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@30.4.1: resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.4.1: - resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} + jest-util@30.5.1: + resolution: {integrity: sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.4.1: - resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} + jest-validate@30.5.1: + resolution: {integrity: sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.5.2: + resolution: {integrity: sha512-rqRgg4R11GA9m1UsEZwQeixHsgZReCn6TOHAHtIH33yXrIvoX0OGPA20Yzzjkz7X40fZvcRSxEpQppYPcWzmcQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-websocket-mock@2.5.0: resolution: {integrity: sha512-a+UJGfowNIWvtIKIQBHoEWIUqRxxQHFx4CXT+R5KxxKBtEQ5rS3pPOV/5299sHzqbmeCzxxY5qE4+yfXePePig==} - jest-worker@30.4.1: - resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} + jest-worker@30.5.1: + resolution: {integrity: sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.4.2: - resolution: {integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==} + jest@30.5.2: + resolution: {integrity: sha512-3gnpdBIza8ijCl3iMV9ChE3hSt1+46865qqod863gQtJr1DixOkAU5DoGbi3u+XlRcw++BhZQMu/y4xBdHBvSQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3235,9 +3041,6 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jose@6.2.10: - resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==} - js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -3262,9 +3065,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -3274,9 +3074,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3288,8 +3085,8 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -3376,8 +3173,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listr2@11.0.0: - resolution: {integrity: sha512-8K88S0aSrcSXdJfiZtEy5BQMnR+TyjrCGLcgAvQs6ta0NEnIm0RJ72/Pv67Jvg07cfBhDbuN74V81lSSVYEFEw==} + listr2@11.1.0: + resolution: {integrity: sha512-xsuczF6mWkEo/E80QHaEokQzKmTy7m80KcLRnkUt9wrcePres2w7dbQi5zOsWtDUg8Dac4gPFyu4EJ/IvKwTOg==} engines: {node: '>=22.13.0'} lmdb@3.5.6: @@ -3412,8 +3209,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -3422,6 +3219,9 @@ packages: magic-string@1.0.0: resolution: {integrity: sha512-CGvjzMN08iv6w1mm4/x3Gh1hLb4VnyRUA15FFpl6CsCIGGoe36k7kY5KNz9QDbSBN5I/fWHM6ZlIkUTa5xdUEA==} + magic-string@1.4.1: + resolution: {integrity: sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -3429,38 +3229,20 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + marked@18.0.14: + resolution: {integrity: sha512-mBHK6FBHuBAlhgRe88w9F0O1AbwwXJUcQibUbC/QcdTbVGAD7aWza+xt3N6oT/jCZx3/OMeS+8rnuiHZcQ9s7A==} + engines: {node: '>= 20'} + hasBin: true material-colors@1.2.6: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - media-typer@1.1.1: - resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} - engines: {node: '>= 0.8'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - mime-names@1.0.0: resolution: {integrity: sha512-vLNEfYU63fz34panv/L3Lh3eW3+v0BlOB+bSGFdntv/gBNnokCbSsaNuHR9vH/NS5oWbL0HqMQf/3we4fRJyIQ==} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3473,9 +3255,6 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3527,10 +3306,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@1.1.0: - resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} - engines: {node: '>=18'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -3587,8 +3362,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.53: - resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + node-releases@2.0.57: + resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} engines: {node: '>=18'} normalize-diacritics@5.0.0: @@ -3607,31 +3382,17 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@3.0.1: + resolution: {integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==} + engines: {node: '>=20.19.0'} nwsapi@2.2.24: resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -3648,11 +3409,11 @@ packages: resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} - ordered-binary@1.6.1: - resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + ordered-binary@1.6.2: + resolution: {integrity: sha512-BY+qgDArmYpvvmij141xbkB4Cw8RFLBQM5Zj4MODFb1SyXBRE/xO4Xj/QWbR7aUEBxbkjuNdsFVCL2TmbYrlNg==} - oxc-parser@0.142.0: - resolution: {integrity: sha512-kKR+jPiRJYJDexVoziIg/FVGvr1fT1FZSSJOk6tVoMKKSlsf1Cso+cgGCJkOEDWOP174vRntCPFKg+AS7InWvw==} + oxc-parser@0.150.0: + resolution: {integrity: sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==} engines: {node: ^20.19.0 || >=22.12.0} p-limit@2.3.0: @@ -3697,18 +3458,10 @@ packages: parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3717,11 +3470,12 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - pdfjs-dist@6.2.108: - resolution: {integrity: sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==} + pdfjs-dist@6.3.289: + resolution: {integrity: sha512-ZHjSVpDa3D6izMq8/04lvkhkATUmL9px6ChPaXc1k6nU2Mrhlg1/7F0bdUqCwUjw3NsPTfPZsMDUU6ZIcRaeQw==} engines: {node: '>=22.13.0 || >=24'} picocolors@1.1.1: @@ -3743,14 +3497,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - piscina@5.2.0: - resolution: {integrity: sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==} + piscina@5.3.2: + resolution: {integrity: sha512-vv7l/mM7B9WgrhDaudIqv1x6v4LOBRYYmpWGdWushhpbCmVHp11sUB2v4hj1CAeTGXVxuZFz6xOU1RalAiPKfQ==} engines: {node: '>=20.x'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -3768,14 +3518,14 @@ packages: postcss-media-query-parser@0.2.3: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - postcss-safe-parser@7.0.1: - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + postcss-safe-parser@7.1.0: + resolution: {integrity: sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3792,8 +3542,8 @@ packages: vue-tsc: optional: true - prettier@3.9.6: - resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} engines: {node: '>=14'} hasBin: true @@ -3805,14 +3555,14 @@ packages: resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.5.1: + resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + proc-log@7.0.0: resolution: {integrity: sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - proxy-agent-negotiate@1.1.0: resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} engines: {node: '>= 20'} @@ -3829,23 +3579,15 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} - engines: {node: '>=0.6'} - - range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.8: - resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + react-is@19.3.0: + resolution: {integrity: sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==} readdirp@5.1.1: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} @@ -3877,20 +3619,11 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - rolldown@1.1.5: - resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + rolldown@1.2.8: + resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.2.0: - resolution: {integrity: sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -3900,8 +3633,125 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.101.0: - resolution: {integrity: sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==} + sass-embedded-all-unknown@1.104.1: + resolution: {integrity: sha512-toyMCyUKkT6DsYlHuKZGjd8T6WltaW4TGX07F7HnF4tNJM5m/8VaVsd74zrq3QSPqGE9JjxIDK4NrNc/QY9pkA==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.104.1: + resolution: {integrity: sha512-yW3BVW4YFpN2vu2cVQ+Pz5JrRTvoIz36aCdo+J/Mo1A9gEN8eVPV/AL7aeZ803YdKgIitd3qw3pY4wpmT6TXNg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + sass-embedded-android-arm@1.104.1: + resolution: {integrity: sha512-g/XPAJYAzSSQZFP4xCdGD0HLKB4mf24cJ/+5Nls8rMool3jNkBv9+AFO4EV0b+RxN8rLcEsMccH1CR64yIFYcQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + + sass-embedded-android-riscv64@1.104.1: + resolution: {integrity: sha512-ZYY8oMKQS7Q/6FBoC8w3T16O3MucDe3xv8iKym41Nht5uvLCGGpm4fC4OF5nlv7wQkJv8oactYddGG3Wd0Rqkg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] + + sass-embedded-android-x64@1.104.1: + resolution: {integrity: sha512-5WZKC4lSfjMIjzZdQUlYQUAV+UiatBhD8w28U7cYLLj4/dMgEPOBd4g3VMv0BwpgH2JOaycMS42dXq29W2bcDg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + + sass-embedded-darwin-arm64@1.104.1: + resolution: {integrity: sha512-oatuHzn0NsEg0d9Dcze6CuWUPvuETtMxRK4cv0eRAg7p6R0vHnv5GZRyWG6gEy3nc/ha/L+GtTasWVU82f4jrQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + sass-embedded-darwin-x64@1.104.1: + resolution: {integrity: sha512-gql/5sHGzUTVwuHfM3QLCDeb6NYwen+LLj22gz81C2NKHF/4nUtDyh4N+fURWdT7J0/EhtMOd0+FLML3sGNP7g==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + sass-embedded-linux-arm64@1.104.1: + resolution: {integrity: sha512-sVWUKXNTu8sP3X95Df0xo/t49Ce5IseTIMqXHxhFBKVmx7gf7kBWNLK0wH5ym+4khc+B5nNJPgq4IxpelG8tMQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: glibc + + sass-embedded-linux-arm@1.104.1: + resolution: {integrity: sha512-WfmshPJOp9vUKxgp8wZ2ncaKBbyrlW9J51M2aUQHWECjMNxTULnGOHWSmD7FViXv4zwn1Co5FIFQUipW7RCxtA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: glibc + + sass-embedded-linux-musl-arm64@1.104.1: + resolution: {integrity: sha512-H7b+LzZ/w8pwNExInM8HDHraqvxCMdUc5ZRGU/aSJJhZ9HjeRKBjF3GxaisVHnx7o18j1l4VQ5cLBL9tTmNzZw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-arm@1.104.1: + resolution: {integrity: sha512-k0cQ/CxBzFVYiQEObg6CpF6CUglkdEhi/DZgZXQbwC27kbGGY+fatmIs/cFPJL2z1ulACwoAr86RQUFzYvw5eg==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: musl + + sass-embedded-linux-musl-riscv64@1.104.1: + resolution: {integrity: sha512-9DYdn4wfrkidjxJVtEd2iCx8HKdZe+uF82GDmrYEZhgu4NjVE6a4fQyW7OLwzn3erZMHKBaObBOH1d37DnXI1A==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-x64@1.104.1: + resolution: {integrity: sha512-5xz+nAr01b6yaRdrGVgE7lNvm1lGFjwNdUvnz+teidvHCbD5oTcbhrRVrnDoLHHvq5n3Jve9TzWaaHhezaEfHA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: musl + + sass-embedded-linux-riscv64@1.104.1: + resolution: {integrity: sha512-oWryPJWTXK5adtlz/FD7wd2kS4I0CEgp6mWLUVb4oMFURMLz9bA9fO87D7lc4SV++lds7T51PU1kykCbOvNHMg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: glibc + + sass-embedded-linux-x64@1.104.1: + resolution: {integrity: sha512-j/sX/yKTx/wJKepC5/ISlR6kPeSuHKThf76D2za5i2VnbHg0MN19jQq3WMorowR3kRghqt6azs3awogG+e7IRA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: glibc + + sass-embedded-unknown-all@1.104.1: + resolution: {integrity: sha512-RaMsYZB5mRioL4qhoI7T5mmNb2OunakbPTJW2cuu3MeIULnGoxo7Wd5QKFxeQvF7sSQL57RuaQ+q9pH+/pQ9Fg==} + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.104.1: + resolution: {integrity: sha512-fS6DL7lcnTPclqGLF4xRt8egZlFY9cU23d57ufbWqaUbCFu9JTu0+8qB4jMxfx1la6byi3GoSTfbnNOLfWv8sw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + sass-embedded-win32-x64@1.104.1: + resolution: {integrity: sha512-/c4N2A93Ckms6DuRFVftKYISuI1tyC8gmlVJ8WaWFzgCBN/Swq2rARJIBUNeuxlmxjmYXfd3+2f/u887K63wbA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + sass-embedded@1.104.1: + resolution: {integrity: sha512-7LxbtPJ1MWKVbhzOnGx1sHTkHTcHVJ9hbgVsU29p/8gY1VeXt19fcJFr5xsx2f6zfrrR3FeOcYMt0uYDLAxpgw==} + engines: {node: '>=20.19.0'} + hasBin: true + + sass@1.104.1: + resolution: {integrity: sha512-yDA+1aIG3EHgN4V/BvuhCvu61FF6hEd4e+9DxikUm9U0CAGuvdIZ/UYy7qbOxjhbbWQraoyLlMuzdRGOSV5Bmw==} engines: {node: '>=20.19.0'} hasBin: true @@ -3918,17 +3768,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3937,22 +3776,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3964,17 +3787,14 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@9.0.0: - resolution: {integrity: sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==} + slice-ansi@9.0.1: + resolution: {integrity: sha512-aBY19bn/XA+hKOKX0qL7Z0UfdBsbQvc9hn993U8ALUjzxCvDcuZqLoRXjGJrUARWAlwMnsRVD9sw2AFNOYvalA==} engines: {node: '>=22'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -3986,6 +3806,10 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3993,10 +3817,6 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - stdin-discarder@0.3.2: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} @@ -4017,8 +3837,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.2: - resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} engines: {node: '>=20'} strip-ansi@6.0.1: @@ -4052,13 +3872,21 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + sync-child-process@1.0.2: + resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} + engines: {node: '>=16.0.0'} + + sync-message-port@1.2.0: + resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} + engines: {node: '>=16.0.0'} + synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} @@ -4071,13 +3899,6 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -4152,10 +3973,6 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -4166,18 +3983,14 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - update-browserslist-db@1.3.1: - resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4203,17 +4016,20 @@ packages: resolution: {integrity: sha512-SCv6OOV6Xj2/3cXy3dGmADluJTNcL3o7hZAglNPTe+WYuEuvxgJzxPrSDLZhF+CwyQOubqgecjMmTJGMVLWjYQ==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - vite@8.1.5: - resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + + vite@8.3.0: + resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.7.1 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -4254,13 +4070,6 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - watchpack@2.5.2: - resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} - engines: {node: '>=10.13.0'} - weak-lru-cache@1.2.2: resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} @@ -4293,8 +4102,8 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@10.0.1: - resolution: {integrity: sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==} + wrap-ansi@10.0.2: + resolution: {integrity: sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg==} engines: {node: '>=20'} wrap-ansi@7.0.0: @@ -4309,9 +4118,6 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4338,6 +4144,9 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4361,6 +4170,10 @@ packages: resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -4373,13 +4186,8 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} snapshots: @@ -4390,25 +4198,25 @@ snapshots: '@angular-builders/common@6.0.1(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.6(chokidar@5.0.0) - '@schematics/angular': 22.1.3(chokidar@5.0.0) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@schematics/angular': 22.1.8(chokidar@5.0.0) get-tsconfig: 4.14.1 jiti: 2.7.0 transitivePeerDependencies: - chokidar - '@angular-builders/jest@22.0.1(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(chokidar@5.0.0)(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(rxjs@7.8.2)(typescript@6.0.3)': + '@angular-builders/jest@22.0.1(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(chokidar@5.0.0)(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(rxjs@7.8.2)(typescript@6.0.3)': dependencies: '@angular-builders/common': 6.0.1(chokidar@5.0.0) '@angular-devkit/architect': 0.2201.3(chokidar@5.0.0) - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.6(chokidar@5.0.0) - '@angular/compiler-cli': 22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@angular/compiler-cli': 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) '@schematics/angular': 22.1.3(chokidar@5.0.0) - jest: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) - jest-preset-angular: 17.0.0(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3) + jest: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) + jest-preset-angular: 17.0.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3) lodash: 4.18.1 rxjs: 7.8.2 transitivePeerDependencies: @@ -4429,9 +4237,16 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/architect@0.2201.6(chokidar@5.0.0)': + '@angular-devkit/architect@0.2201.8(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) + '@angular-devkit/core': 22.1.8(chokidar@5.0.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/architect@0.2202.0(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar @@ -4447,7 +4262,7 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/core@22.1.6(chokidar@5.0.0)': + '@angular-devkit/core@22.1.8(chokidar@5.0.0)': dependencies: ajv: 8.20.0 ajv-formats: 3.0.1 @@ -4458,6 +4273,17 @@ snapshots: optionalDependencies: chokidar: 5.0.0 + '@angular-devkit/core@22.2.0(chokidar@5.0.0)': + dependencies: + ajv: 8.20.0 + ajv-formats: 3.0.1 + jsonc-parser: 3.3.1 + picomatch: 4.0.7 + rxjs: 7.8.2 + source-map: 0.8.0 + optionalDependencies: + chokidar: 5.0.0 + '@angular-devkit/schematics@22.1.3(chokidar@5.0.0)': dependencies: '@angular-devkit/core': 22.1.3(chokidar@5.0.0) @@ -4468,9 +4294,9 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/schematics@22.1.6(chokidar@5.0.0)': + '@angular-devkit/schematics@22.1.8(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) + '@angular-devkit/core': 22.1.8(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 1.0.0 ora: 9.4.1 @@ -4478,47 +4304,55 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@22.1.0(@angular/cli@22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1))(chokidar@5.0.0)(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-devkit/schematics@22.2.0(chokidar@5.0.0)': dependencies: - '@angular-devkit/architect': 0.2201.3(chokidar@5.0.0) - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular/cli': 22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + jsonc-parser: 3.3.1 + magic-string: 1.4.1 + ora: 9.4.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-eslint/builder@22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + dependencies: + '@angular-devkit/architect': 0.2201.8(chokidar@5.0.0) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - chokidar - '@angular-eslint/bundled-angular-compiler@22.1.0': {} + '@angular-eslint/bundled-angular-compiler@22.5.0': {} - '@angular-eslint/eslint-plugin-template@22.1.0(@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.68.0)(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-eslint/eslint-plugin-template@22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 22.1.0 - '@angular-eslint/template-parser': 22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) - '@angular-eslint/utils': 22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@angular-eslint/template-parser': 22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + '@angular-eslint/utils': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 6.0.3 - '@angular-eslint/eslint-plugin@22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-eslint/eslint-plugin@22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 22.1.0 - '@angular-eslint/utils': 22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@angular-eslint/utils': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 - '@angular-eslint/schematics@22.1.0(@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@angular/cli@22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1))(@typescript-eslint/types@8.68.0)(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-eslint/schematics@22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': dependencies: - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.6(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) - '@angular-eslint/eslint-plugin-template': 22.1.0(@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.68.0)(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) - '@angular/cli': 22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1) - ignore: 7.0.5 + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@angular-eslint/eslint-plugin': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + '@angular-eslint/eslint-plugin-template': 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) + ignore: 7.0.8 semver: 7.8.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -4529,66 +4363,65 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@22.1.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 22.1.0 - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + '@angular-eslint/bundled-angular-compiler': 22.5.0 + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) eslint-scope: 9.1.2 typescript: 6.0.3 - '@angular-eslint/utils@22.1.0(@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': + '@angular-eslint/utils@22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 22.1.0 - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 6.0.3 - '@angular/build@22.1.6(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3)(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@types/node@26.4.0)(chokidar@5.0.0)(istanbul-lib-instrument@6.0.3(supports-color@8.1.1))(jiti@2.7.0)(postcss@8.5.26)(supports-color@8.1.1)(tslib@2.8.1)(typescript@6.0.3)': + '@angular/build@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0)(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@types/node@26.6.2)(istanbul-lib-instrument@6.0.3(supports-color@8.1.1))(jiti@2.7.0)(postcss@8.5.28)(supports-color@8.1.1)(tslib@2.8.1)(typescript@6.0.3)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2201.6(chokidar@5.0.0) - '@angular/compiler': 22.1.3 - '@angular/compiler-cli': 22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3) - '@babel/core': 8.0.1 - '@babel/helper-annotate-as-pure': 8.0.0 - '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 6.1.1(@types/node@26.4.0) - '@vitejs/plugin-basic-ssl': 2.3.0(vite@8.1.5(@types/node@26.4.0)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)) - beasties: 0.4.3 - browserslist: 4.28.8 + '@angular-devkit/architect': 0.2202.0(chokidar@5.0.0) + '@angular/compiler': 22.2.0 + '@angular/compiler-cli': 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) + '@babel/core': 8.0.5 + '@inquirer/confirm': 6.3.2(@types/node@26.6.2) + '@parcel/watcher': 2.6.0 + '@vitejs/plugin-basic-ssl': 2.3.0(vite@8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)) + beasties: 0.5.4 + browserslist: 4.29.1 + chokidar: 5.0.0 esbuild: 0.28.2 https-proxy-agent: 9.1.0(supports-color@8.1.1) jsonc-parser: 3.3.1 - listr2: 11.0.0 - magic-string: 1.0.0 + listr2: 11.1.0 + magic-string: 1.4.1 mrmime: 2.0.1 - oxc-parser: 0.142.0 + oxc-parser: 0.150.0 parse5-html-rewriting-stream: 8.0.1 - picomatch: 4.0.5 - piscina: 5.2.0 - rolldown: 1.2.0 - sass: 1.101.0 + picomatch: 4.0.7 + piscina: 5.3.2 + rolldown: 1.2.8 + sass: 1.104.1 + sass-embedded: 1.104.1 semver: 7.8.5 source-map-support: 0.5.21 tinyglobby: 0.2.17 tslib: 2.8.1 typescript: 6.0.3 - vite: 8.1.5(@types/node@26.4.0)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) - watchpack: 2.5.2 + vite: 8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) + xxhash-wasm: 1.1.0 optionalDependencies: - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/localize': 22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3) - '@angular/platform-browser': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/localize': 22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) lmdb: 3.5.6 - postcss: 8.5.26 + postcss: 8.5.28 transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' - - chokidar - jiti - kerberos - - sass-embedded - stylus - sugarss - supports-color @@ -4596,97 +4429,96 @@ snapshots: - tsx - yaml - '@angular/cdk@22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/cdk@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/platform-browser': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/forms': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@22.1.6(@types/node@26.4.0)(chokidar@5.0.0)(supports-color@8.1.1)': + '@angular/cli@22.2.0(@types/node@26.6.2)(chokidar@5.0.0)': dependencies: - '@angular-devkit/architect': 0.2201.6(chokidar@5.0.0) - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.6(chokidar@5.0.0) - '@inquirer/prompts': 8.5.2(@types/node@26.4.0) - '@listr2/prompt-adapter-inquirer': 4.2.5(@inquirer/prompts@8.5.2(@types/node@26.4.0))(@types/node@26.4.0)(listr2@11.0.0) - '@modelcontextprotocol/sdk': 1.30.0(supports-color@8.1.1) - '@schematics/angular': 22.1.6(chokidar@5.0.0) + '@angular-devkit/architect': 0.2202.0(chokidar@5.0.0) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@inquirer/prompts': 8.7.2(@types/node@26.6.2) + '@listr2/prompt-adapter-inquirer': 4.2.7(@inquirer/prompts@8.7.2(@types/node@26.6.2))(@types/node@26.6.2)(listr2@11.1.0) + '@modelcontextprotocol/server': 2.0.0 + '@schematics/angular': 22.2.0(chokidar@5.0.0) jsonc-parser: 3.3.1 - listr2: 11.0.0 + listr2: 11.1.0 npm-package-arg: 14.0.0 parse5-html-rewriting-stream: 8.0.1 semver: 7.8.5 yargs: 18.1.0 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - - '@cfworker/json-schema' - '@types/node' - chokidar - - supports-color - '@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2)': + '@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3)': + '@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3)': dependencies: - '@angular/compiler': 22.1.3 + '@angular/compiler': 22.2.0 '@babel/core': 8.0.1 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 chokidar: 5.0.0 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 semver: 7.8.5 tslib: 2.8.1 - yargs: 18.1.0 + yargs: 18.2.0 optionalDependencies: typescript: 6.0.3 - '@angular/compiler@22.1.3': + '@angular/compiler@22.2.0': dependencies: tslib: 2.8.1 - '@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)': + '@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 22.1.3 + '@angular/compiler': 22.2.0 - '@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/platform-browser': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - zod: 4.4.3 + zod: 4.6.5 - '@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3)': + '@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0)': dependencies: - '@angular/compiler': 22.1.3 - '@angular/compiler-cli': 22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3) + '@angular/compiler': 22.2.0 + '@angular/compiler-cli': 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) '@babel/core': 8.0.1 tinyglobby: 0.2.17 - yargs: 18.1.0 + yargs: 18.2.0 - '@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))': + '@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))': dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) tslib: 2.8.1 - '@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/platform-browser': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) rxjs: 7.8.2 tslib: 2.8.1 @@ -4704,14 +4536,14 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@8.0.0': + '@babel/code-frame@8.0.6': dependencies: - '@babel/helper-validator-identifier': 8.0.4 + '@babel/helper-validator-identifier': 8.0.6 js-tokens: 10.0.0 '@babel/compat-data@7.29.7': {} - '@babel/compat-data@8.0.0': {} + '@babel/compat-data@8.0.5': {} '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: @@ -4735,23 +4567,42 @@ snapshots: '@babel/core@8.0.1': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/generator': 8.0.0 - '@babel/helper-compilation-targets': 8.0.0 - '@babel/helpers': 8.0.0 - '@babel/parser': 8.0.4 + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 '@babel/template': 8.0.0 - '@babel/traverse': 8.0.4 - '@babel/types': 8.0.4 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 '@types/gensync': 1.0.5 convert-source-map: 2.0.0 - empathic: 2.0.1 + empathic: 2.1.0 gensync: 1.0.0-beta.2 import-meta-resolve: 4.2.0 json5: 2.2.3 - obug: 2.1.4 + obug: 2.2.1 semver: 7.8.5 + '@babel/core@8.0.5': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.1.0 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + verkit: 0.3.2 + '@babel/generator@7.29.8': dependencies: '@babel/parser': 7.29.8 @@ -4760,38 +4611,34 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@8.0.0': + '@babel/generator@8.0.6': dependencies: - '@babel/parser': 8.0.4 - '@babel/types': 8.0.4 - '@jridgewell/gen-mapping': 0.3.13 + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 + '@jridgewell/gen-mapping': 0.4.0-beta.0 '@jridgewell/trace-mapping': 0.3.31 '@types/jsesc': 2.5.1 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@8.0.0': - dependencies: - '@babel/types': 8.0.4 - '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.8 + browserslist: 4.29.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@8.0.0': + '@babel/helper-compilation-targets@8.0.6': dependencies: - '@babel/compat-data': 8.0.0 + '@babel/compat-data': 8.0.5 '@babel/helper-validator-option': 8.0.0 - browserslist: 4.28.8 - lru-cache: 11.5.2 - semver: 7.8.5 + browserslist: 4.29.1 + flru: 1.0.2 + verkit: 0.3.2 '@babel/helper-globals@7.29.7': {} - '@babel/helper-globals@8.0.0': {} + '@babel/helper-globals@8.0.6': {} '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: @@ -4811,17 +4658,13 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.29.8 - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-string-parser@8.0.6': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-identifier@8.0.4': {} + '@babel/helper-validator-identifier@8.0.6': {} '@babel/helper-validator-option@7.29.7': {} @@ -4832,18 +4675,18 @@ snapshots: '@babel/template': 7.29.7 '@babel/types': 7.29.8 - '@babel/helpers@8.0.0': + '@babel/helpers@8.0.5': dependencies: '@babel/template': 8.0.0 - '@babel/types': 8.0.4 + '@babel/types': 8.0.6 '@babel/parser@7.29.8': dependencies: '@babel/types': 7.29.8 - '@babel/parser@8.0.4': + '@babel/parser@8.0.6': dependencies: - '@babel/types': 8.0.4 + '@babel/types': 8.0.6 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: @@ -4938,9 +4781,9 @@ snapshots: '@babel/template@8.0.0': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/parser': 8.0.4 - '@babel/types': 8.0.4 + '@babel/code-frame': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 '@babel/traverse@7.29.8(supports-color@8.1.1)': dependencies: @@ -4954,28 +4797,42 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@8.0.4': + '@babel/traverse@8.0.6': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/generator': 8.0.0 - '@babel/helper-globals': 8.0.0 - '@babel/parser': 8.0.4 + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-globals': 8.0.6 + '@babel/parser': 8.0.6 '@babel/template': 8.0.0 - '@babel/types': 8.0.4 - obug: 2.1.4 + '@babel/types': 8.0.6 + obug: 2.2.1 '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@8.0.4': + '@babel/types@8.0.6': dependencies: - '@babel/helper-string-parser': 8.0.0 - '@babel/helper-validator-identifier': 8.0.4 + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 '@bcoe/v8-coverage@0.2.3': {} + '@bufbuild/protobuf@2.15.0': {} + + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -5008,43 +4865,16 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/core@1.11.1': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/core@1.11.2': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.2': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - '@esbuild/aix-ppc64@0.28.2': optional: true @@ -5123,9 +4953,9 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))': dependencies: - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -5148,7 +4978,7 @@ snapshots: '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/plugin-kit@0.7.3': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -5156,10 +4986,6 @@ snapshots: '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@2.1.1(hono@4.13.5)': - dependencies: - hono: 4.13.5 - '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -5176,143 +5002,124 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@2.0.7': {} + '@inquirer/ansi@2.0.8': {} - '@inquirer/checkbox@5.2.2(@types/node@26.4.0)': + '@inquirer/checkbox@5.2.5(@types/node@26.6.2)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/confirm@6.1.1(@types/node@26.4.0)': + '@inquirer/confirm@6.3.2(@types/node@26.6.2)': dependencies: - '@inquirer/core': 11.2.1(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/confirm@6.2.0(@types/node@26.4.0)': + '@inquirer/core@12.0.3(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) - optionalDependencies: - '@types/node': 26.4.0 - - '@inquirer/core@11.2.1(@types/node@26.4.0)': - dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.6.2) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/core@12.0.0(@types/node@26.4.0)': + '@inquirer/editor@5.3.3(@types/node@26.6.2)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.0.7(@types/node@26.4.0) - cli-width: 4.1.0 - fast-wrap-ansi: 0.2.2 - mute-stream: 3.0.0 - signal-exit: 4.1.0 + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/external-editor': 3.0.5(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/editor@5.3.0(@types/node@26.4.0)': + '@inquirer/expand@5.1.5(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/external-editor': 3.0.4(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/expand@5.1.2(@types/node@26.4.0)': - dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) - optionalDependencies: - '@types/node': 26.4.0 - - '@inquirer/external-editor@3.0.4(@types/node@26.4.0)': + '@inquirer/external-editor@3.0.5(@types/node@26.6.2)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/figures@2.0.8': {} + '@inquirer/figures@2.0.9': {} - '@inquirer/input@5.1.3(@types/node@26.4.0)': + '@inquirer/input@5.1.6(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/number@4.2.0(@types/node@26.4.0)': + '@inquirer/number@4.2.3(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/password@5.1.2(@types/node@26.4.0)': + '@inquirer/password@5.2.2(@types/node@26.6.2)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/prompts@8.5.2(@types/node@26.4.0)': + '@inquirer/prompts@8.7.2(@types/node@26.6.2)': dependencies: - '@inquirer/checkbox': 5.2.2(@types/node@26.4.0) - '@inquirer/confirm': 6.2.0(@types/node@26.4.0) - '@inquirer/editor': 5.3.0(@types/node@26.4.0) - '@inquirer/expand': 5.1.2(@types/node@26.4.0) - '@inquirer/input': 5.1.3(@types/node@26.4.0) - '@inquirer/number': 4.2.0(@types/node@26.4.0) - '@inquirer/password': 5.1.2(@types/node@26.4.0) - '@inquirer/rawlist': 5.3.2(@types/node@26.4.0) - '@inquirer/search': 4.3.0(@types/node@26.4.0) - '@inquirer/select': 5.2.2(@types/node@26.4.0) + '@inquirer/checkbox': 5.2.5(@types/node@26.6.2) + '@inquirer/confirm': 6.3.2(@types/node@26.6.2) + '@inquirer/editor': 5.3.3(@types/node@26.6.2) + '@inquirer/expand': 5.1.5(@types/node@26.6.2) + '@inquirer/input': 5.1.6(@types/node@26.6.2) + '@inquirer/number': 4.2.3(@types/node@26.6.2) + '@inquirer/password': 5.2.2(@types/node@26.6.2) + '@inquirer/rawlist': 5.3.5(@types/node@26.6.2) + '@inquirer/search': 4.3.3(@types/node@26.6.2) + '@inquirer/select': 5.2.5(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/rawlist@5.3.2(@types/node@26.4.0)': + '@inquirer/rawlist@5.3.5(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/search@4.3.0(@types/node@26.4.0)': + '@inquirer/search@4.3.3(@types/node@26.6.2)': dependencies: - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/select@5.2.2(@types/node@26.4.0)': + '@inquirer/select@5.2.5(@types/node@26.6.2)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.0(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.0.7(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.6.2) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.6.2) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 - '@inquirer/type@4.0.7(@types/node@26.4.0)': + '@inquirer/type@4.1.1(@types/node@26.6.2)': optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 '@isaacs/cliui@8.0.2': dependencies: @@ -5333,44 +5140,44 @@ snapshots: '@istanbuljs/schema@0.1.6': {} - '@jest/console@30.4.1': + '@jest/console@30.5.2': dependencies: - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 chalk: 4.1.2 - jest-message-util: 30.4.1 - jest-util: 30.4.1 + jest-message-util: 30.5.1 + jest-util: 30.5.1 slash: 3.0.0 - '@jest/core@30.4.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3))': + '@jest/core@30.5.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3))': dependencies: - '@jest/console': 30.4.1 - '@jest/pattern': 30.4.0 - '@jest/reporters': 30.4.1(supports-color@8.1.1) - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/console': 30.5.2 + '@jest/pattern': 30.5.0 + '@jest/reporters': 30.5.2(supports-color@8.1.1) + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 + '@types/node': 26.6.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 exit-x: 0.2.2 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-changed-files: 30.4.1 - jest-config: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) - jest-haste-map: 30.4.1 - jest-message-util: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-resolve-dependencies: 30.4.2(supports-color@8.1.1) - jest-runner: 30.4.2(supports-color@8.1.1) - jest-runtime: 30.4.2(supports-color@8.1.1) - jest-snapshot: 30.4.1(supports-color@8.1.1) - jest-util: 30.4.1 - jest-validate: 30.4.1 - jest-watcher: 30.4.1 - pretty-format: 30.4.1 + jest-changed-files: 30.5.1 + jest-config: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-resolve-dependencies: 30.5.2(supports-color@8.1.1) + jest-runner: 30.5.2(supports-color@8.1.1) + jest-runtime: 30.5.2(supports-color@8.1.1) + jest-snapshot: 30.5.2(supports-color@8.1.1) + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-watcher: 30.5.2 + pretty-format: 30.5.1 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -5380,32 +5187,56 @@ snapshots: '@jest/diff-sequences@30.4.0': {} + '@jest/diff-sequences@30.5.0': {} + '@jest/environment-jsdom-abstract@30.4.1(jsdom@26.1.0(supports-color@8.1.1))': dependencies: '@jest/environment': 30.4.1 '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 '@types/jsdom': 21.1.7 - '@types/node': 26.4.0 + '@types/node': 26.6.2 jest-mock: 30.4.1 jest-util: 30.4.1 jsdom: 26.1.0(supports-color@8.1.1) + '@jest/environment-jsdom-abstract@30.5.2(@types/jsdom@21.1.7)(jsdom@26.1.0(supports-color@8.1.1))': + dependencies: + '@jest/environment': 30.5.2 + '@jest/fake-timers': 30.5.2 + '@jest/types': 30.5.1 + '@types/jsdom': 21.1.7 + '@types/node': 26.6.2 + jest-mock: 30.5.2 + jest-util: 30.5.1 + jsdom: 26.1.0(supports-color@8.1.1) + '@jest/environment@30.4.1': dependencies: '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@types/node': 26.6.2 jest-mock: 30.4.1 + '@jest/environment@30.5.2': + dependencies: + '@jest/fake-timers': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 + jest-mock: 30.5.2 + '@jest/expect-utils@30.4.1': dependencies: '@jest/get-type': 30.1.0 - '@jest/expect@30.4.1(supports-color@8.1.1)': + '@jest/expect-utils@30.5.2': dependencies: - expect: 30.4.1 - jest-snapshot: 30.4.1(supports-color@8.1.1) + '@jest/get-type': 30.5.0 + + '@jest/expect@30.5.2(supports-color@8.1.1)': + dependencies: + expect: 30.5.2 + jest-snapshot: 30.5.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -5413,49 +5244,65 @@ snapshots: dependencies: '@jest/types': 30.4.1 '@sinonjs/fake-timers': 15.4.0 - '@types/node': 26.4.0 + '@types/node': 26.6.2 jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 + '@jest/fake-timers@30.5.2': + dependencies: + '@jest/types': 30.5.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 26.6.2 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-util: 30.5.1 + '@jest/get-type@30.1.0': {} - '@jest/globals@30.4.1(supports-color@8.1.1)': + '@jest/get-type@30.5.0': {} + + '@jest/globals@30.5.2(supports-color@8.1.1)': dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 - jest-mock: 30.4.1 + '@jest/environment': 30.5.2 + '@jest/expect': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 + jest-mock: 30.5.2 transitivePeerDependencies: - supports-color '@jest/pattern@30.4.0': dependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 jest-regex-util: 30.4.0 - '@jest/reporters@30.4.1(supports-color@8.1.1)': + '@jest/pattern@30.5.0': + dependencies: + '@types/node': 26.6.2 + jest-regex-util: 30.5.0 + + '@jest/reporters@30.5.2(supports-color@8.1.1)': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 + '@jest/console': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 26.4.0 + '@types/node': 26.6.2 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 - glob: 10.5.0 + glob: 13.0.6 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6(supports-color@8.1.1) istanbul-reports: 3.2.0 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - jest-worker: 30.4.1 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + jest-worker: 30.5.1 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -5470,46 +5317,51 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.52 - '@jest/snapshot-utils@30.4.1': + '@jest/schemas@30.5.0': dependencies: - '@jest/types': 30.4.1 + '@sinclair/typebox': 0.34.52 + + '@jest/snapshot-utils@30.5.1': + dependencies: + '@jest/types': 30.5.1 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 - '@jest/source-map@30.0.1': + '@jest/source-map@30.5.2': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 + convert-source-map: 2.0.0 graceful-fs: 4.2.11 - '@jest/test-result@30.4.1': + '@jest/test-result@30.5.2': dependencies: - '@jest/console': 30.4.1 - '@jest/types': 30.4.1 + '@jest/console': 30.5.2 + '@jest/types': 30.5.1 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@30.4.1': + '@jest/test-sequencer@30.5.2': dependencies: - '@jest/test-result': 30.4.1 + '@jest/test-result': 30.5.2 graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 + jest-haste-map: 30.5.1 slash: 3.0.0 - '@jest/transform@30.4.1(supports-color@8.1.1)': + '@jest/transform@30.5.2(supports-color@8.1.1)': dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@jest/types': 30.4.1 + '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 7.0.1(supports-color@8.1.1) + babel-plugin-istanbul: 8.0.0(supports-color@8.1.1) chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-regex-util: 30.4.0 - jest-util: 30.4.1 + jest-haste-map: 30.5.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 5.0.1 @@ -5522,13 +5374,28 @@ snapshots: '@jest/schemas': 30.4.1 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 26.4.0 + '@types/node': 26.6.2 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + '@jest/types@30.5.1': + dependencies: + '@jest/pattern': 30.5.0 + '@jest/schemas': 30.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 26.6.2 '@types/yargs': 17.0.35 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -5538,23 +5405,31 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 - '@listr2/prompt-adapter-inquirer@4.2.5(@inquirer/prompts@8.5.2(@types/node@26.4.0))(@types/node@26.4.0)(listr2@11.0.0)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - '@inquirer/prompts': 8.5.2(@types/node@26.4.0) - '@inquirer/type': 4.0.7(@types/node@26.4.0) - listr2: 11.0.0 + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@listr2/prompt-adapter-inquirer@4.2.7(@inquirer/prompts@8.7.2(@types/node@26.6.2))(@types/node@26.6.2)(listr2@11.1.0)': + dependencies: + '@inquirer/prompts': 8.7.2(@types/node@26.6.2) + '@inquirer/type': 4.1.1(@types/node@26.6.2) + listr2: 11.1.0 transitivePeerDependencies: - '@types/node' @@ -5579,27 +5454,14 @@ snapshots: '@lmdb/lmdb-win32-x64@3.5.6': optional: true - '@modelcontextprotocol/sdk@1.30.0(supports-color@8.1.1)': + '@modelcontextprotocol/core@2.0.0': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.5) - ajv: 8.20.0 - ajv-formats: 3.0.1 - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.1 - express: 5.2.1(supports-color@8.1.1) - express-rate-limit: 8.6.2(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1) - hono: 4.13.5 - jose: 6.2.10 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) - transitivePeerDependencies: - - supports-color + zod: 4.6.5 + + '@modelcontextprotocol/server@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + zod: 4.6.5 '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true @@ -5619,52 +5481,52 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': optional: true - '@napi-rs/canvas-android-arm64@1.0.5': + '@napi-rs/canvas-android-arm64@1.0.9': optional: true - '@napi-rs/canvas-darwin-arm64@1.0.5': + '@napi-rs/canvas-darwin-arm64@1.0.9': optional: true - '@napi-rs/canvas-darwin-x64@1.0.5': + '@napi-rs/canvas-darwin-x64@1.0.9': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@1.0.5': + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.9': optional: true - '@napi-rs/canvas-linux-arm64-gnu@1.0.5': + '@napi-rs/canvas-linux-arm64-gnu@1.0.9': optional: true - '@napi-rs/canvas-linux-arm64-musl@1.0.5': + '@napi-rs/canvas-linux-arm64-musl@1.0.9': optional: true - '@napi-rs/canvas-linux-riscv64-gnu@1.0.5': + '@napi-rs/canvas-linux-riscv64-gnu@1.0.9': optional: true - '@napi-rs/canvas-linux-x64-gnu@1.0.5': + '@napi-rs/canvas-linux-x64-gnu@1.0.9': optional: true - '@napi-rs/canvas-linux-x64-musl@1.0.5': + '@napi-rs/canvas-linux-x64-musl@1.0.9': optional: true - '@napi-rs/canvas-win32-arm64-msvc@1.0.5': + '@napi-rs/canvas-win32-arm64-msvc@1.0.9': optional: true - '@napi-rs/canvas-win32-x64-msvc@1.0.5': + '@napi-rs/canvas-win32-x64-msvc@1.0.9': optional: true - '@napi-rs/canvas@1.0.5': + '@napi-rs/canvas@1.0.9': optionalDependencies: - '@napi-rs/canvas-android-arm64': 1.0.5 - '@napi-rs/canvas-darwin-arm64': 1.0.5 - '@napi-rs/canvas-darwin-x64': 1.0.5 - '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.5 - '@napi-rs/canvas-linux-arm64-gnu': 1.0.5 - '@napi-rs/canvas-linux-arm64-musl': 1.0.5 - '@napi-rs/canvas-linux-riscv64-gnu': 1.0.5 - '@napi-rs/canvas-linux-x64-gnu': 1.0.5 - '@napi-rs/canvas-linux-x64-musl': 1.0.5 - '@napi-rs/canvas-win32-arm64-msvc': 1.0.5 - '@napi-rs/canvas-win32-x64-msvc': 1.0.5 + '@napi-rs/canvas-android-arm64': 1.0.9 + '@napi-rs/canvas-darwin-arm64': 1.0.9 + '@napi-rs/canvas-darwin-x64': 1.0.9 + '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.9 + '@napi-rs/canvas-linux-arm64-gnu': 1.0.9 + '@napi-rs/canvas-linux-arm64-musl': 1.0.9 + '@napi-rs/canvas-linux-riscv64-gnu': 1.0.9 + '@napi-rs/canvas-linux-x64-gnu': 1.0.9 + '@napi-rs/canvas-linux-x64-musl': 1.0.9 + '@napi-rs/canvas-win32-arm64-msvc': 1.0.9 + '@napi-rs/canvas-win32-x64-msvc': 1.0.9 optional: true '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -5739,123 +5601,100 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@ng-bootstrap/ng-bootstrap@21.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2)': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': - dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@ng-bootstrap/ng-bootstrap@21.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@popperjs/core@2.11.8)(rxjs@7.8.2)': - dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/forms': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/localize': 22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/forms': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/localize': 22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0) '@popperjs/core': 2.11.8 rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@24.0.2(@angular/cdk@22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))': + '@ng-select/ng-select@24.1.2(4a7eb56833580f1a9810b0df0995c3c6)': dependencies: - '@angular/cdk': 22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/forms': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/cdk': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/forms': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) tslib: 2.8.1 - '@ngneat/dirty-check-forms@3.0.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(lodash-es@4.18.1)(rxjs@7.8.2)': + '@ngneat/dirty-check-forms@3.0.3(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(lodash-es@4.18.1)(rxjs@7.8.2)': dependencies: - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/forms': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/router': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/forms': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/router': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) lodash-es: 4.18.1 rxjs: 7.8.2 tslib: 2.8.1 - '@oxc-parser/binding-android-arm-eabi@0.142.0': + '@oxc-parser/binding-android-arm-eabi@0.150.0': optional: true - '@oxc-parser/binding-android-arm64@0.142.0': + '@oxc-parser/binding-android-arm64@0.150.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.142.0': + '@oxc-parser/binding-darwin-arm64@0.150.0': optional: true - '@oxc-parser/binding-darwin-x64@0.142.0': + '@oxc-parser/binding-darwin-x64@0.150.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.142.0': + '@oxc-parser/binding-freebsd-x64@0.150.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.142.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.142.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.142.0': + '@oxc-parser/binding-linux-arm64-gnu@0.150.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.142.0': + '@oxc-parser/binding-linux-arm64-musl@0.150.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.142.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.142.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.142.0': + '@oxc-parser/binding-linux-riscv64-musl@0.150.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.142.0': + '@oxc-parser/binding-linux-s390x-gnu@0.150.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.142.0': + '@oxc-parser/binding-linux-x64-gnu@0.150.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.142.0': + '@oxc-parser/binding-linux-x64-musl@0.150.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.142.0': + '@oxc-parser/binding-openharmony-arm64@0.150.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.142.0': - dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-parser/binding-win32-arm64-msvc@0.150.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.142.0': + '@oxc-parser/binding-win32-ia32-msvc@0.150.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.142.0': + '@oxc-parser/binding-win32-x64-msvc@0.150.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.142.0': - optional: true + '@oxc-project/types@0.149.0': {} - '@oxc-project/types@0.139.0': {} - - '@oxc-project/types@0.140.0': {} - - '@oxc-project/types@0.142.0': {} + '@oxc-project/types@0.150.0': {} '@parcel/watcher-android-arm64@2.6.0': optional: true @@ -5912,7 +5751,6 @@ snapshots: '@parcel/watcher-linux-x64-musl': 2.6.0 '@parcel/watcher-win32-arm64': 2.6.0 '@parcel/watcher-win32-x64': 2.6.0 - optional: true '@pkgjs/parseargs@0.11.0': optional: true @@ -5925,102 +5763,49 @@ snapshots: '@popperjs/core@2.11.8': {} - '@rolldown/binding-android-arm64@1.1.5': + '@rolldown/binding-android-arm-eabi@1.2.8': optional: true - '@rolldown/binding-android-arm64@1.2.0': + '@rolldown/binding-android-arm64@1.2.8': optional: true - '@rolldown/binding-darwin-arm64@1.1.5': + '@rolldown/binding-darwin-arm64@1.2.8': optional: true - '@rolldown/binding-darwin-arm64@1.2.0': + '@rolldown/binding-darwin-x64@1.2.8': optional: true - '@rolldown/binding-darwin-x64@1.1.5': + '@rolldown/binding-freebsd-x64@1.2.8': optional: true - '@rolldown/binding-darwin-x64@1.2.0': + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': optional: true - '@rolldown/binding-freebsd-x64@1.1.5': + '@rolldown/binding-linux-arm64-gnu@1.2.8': optional: true - '@rolldown/binding-freebsd-x64@1.2.0': + '@rolldown/binding-linux-arm64-musl@1.2.8': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + '@rolldown/binding-linux-ppc64-gnu@1.2.8': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + '@rolldown/binding-linux-s390x-gnu@1.2.8': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.5': + '@rolldown/binding-linux-x64-gnu@1.2.8': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.0': + '@rolldown/binding-linux-x64-musl@1.2.8': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.5': + '@rolldown/binding-openharmony-arm64@1.2.8': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.0': + '@rolldown/binding-win32-arm64-msvc@1.2.8': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.2.0': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.2.0': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.2.0': - optional: true - - '@rolldown/binding-linux-x64-musl@1.1.5': - optional: true - - '@rolldown/binding-linux-x64-musl@1.2.0': - optional: true - - '@rolldown/binding-openharmony-arm64@1.1.5': - optional: true - - '@rolldown/binding-openharmony-arm64@1.2.0': - optional: true - - '@rolldown/binding-wasm32-wasi@1.1.5': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - optional: true - - '@rolldown/binding-wasm32-wasi@1.2.0': - dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.1.5': - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.2.0': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.1.5': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.2.0': + '@rolldown/binding-win32-x64-msvc@1.2.8': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -6034,15 +5819,25 @@ snapshots: transitivePeerDependencies: - chokidar - '@schematics/angular@22.1.6(chokidar@5.0.0)': + '@schematics/angular@22.1.8(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 22.1.6(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.6(chokidar@5.0.0) + '@angular-devkit/core': 22.1.8(chokidar@5.0.0) + '@angular-devkit/schematics': 22.1.8(chokidar@5.0.0) jsonc-parser: 3.3.1 typescript: 6.0.3 transitivePeerDependencies: - chokidar + '@schematics/angular@22.2.0(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + jsonc-parser: 3.3.1 + oxc-parser: 0.150.0 + typescript: 6.0.3 + transitivePeerDependencies: + - chokidar + '@sinclair/typebox@0.27.12': {} '@sinclair/typebox@0.34.52': {} @@ -6114,7 +5909,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -6122,9 +5917,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@26.4.0': + '@types/node@26.6.2': dependencies: - undici-types: 8.3.0 + undici-types: 8.9.0 '@types/stack-utils@2.0.3': {} @@ -6136,72 +5931,72 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.70.1(@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/type-utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.68.0 - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) - ignore: 7.0.6 + '@typescript-eslint/parser': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.70.1 + '@typescript-eslint/type-utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.70.1 + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) + ignore: 7.0.10 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/parser@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/scope-manager': 8.70.1 + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.70.1 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.68.0(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/project-service@8.70.1(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 debug: 4.4.3(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.68.0': + '@typescript-eslint/scope-manager@8.70.1': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/visitor-keys': 8.70.1 - '@typescript-eslint/tsconfig-utils@8.68.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.70.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.68.0': {} + '@typescript-eslint/types@8.70.1': {} - '@typescript-eslint/typescript-estree@8.68.0(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.70.1(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/project-service': 8.70.1(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/visitor-keys': 8.70.1 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.6 semver: 7.8.5 @@ -6211,20 +6006,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1)) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) - eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.70.1 + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0)(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.68.0': + '@typescript-eslint/visitor-keys@8.70.1': dependencies: - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/types': 8.70.1 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.3': {} @@ -6287,7 +6082,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': @@ -6299,14 +6094,9 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true - '@vitejs/plugin-basic-ssl@2.3.0(vite@8.1.5(@types/node@26.4.0)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1))': dependencies: - vite: 8.1.5(@types/node@26.4.0)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.1.0 + vite: 8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) acorn-jsx@5.3.2(acorn@8.18.0): dependencies: @@ -6336,7 +6126,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -6375,30 +6165,30 @@ snapshots: axobject-query@4.1.0: {} - babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): + babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@jest/transform': 30.4.1(supports-color@8.1.1) + '@jest/transform': 30.5.2(supports-color@8.1.1) '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.1(supports-color@8.1.1) - babel-preset-jest: 30.4.0(@babel/core@7.29.7(supports-color@8.1.1)) + babel-plugin-istanbul: 8.0.0(supports-color@8.1.1) + babel-preset-jest: 30.5.0(@babel/core@7.29.7(supports-color@8.1.1)) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@7.0.1(supports-color@8.1.1): + babel-plugin-istanbul@8.0.0(supports-color@8.1.1): dependencies: '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) - test-exclude: 6.0.0 + test-exclude: 7.0.2 transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.4.0: + babel-plugin-jest-hoist@30.5.0: dependencies: '@types/babel__core': 7.20.5 @@ -6421,70 +6211,51 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7(supports-color@8.1.1)) - babel-preset-jest@30.4.0(@babel/core@7.29.7(supports-color@8.1.1)): + babel-preset-jest@30.5.0(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - babel-plugin-jest-hoist: 30.4.0 + babel-plugin-jest-hoist: 30.5.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7(supports-color@8.1.1)) balanced-match@1.0.2: {} balanced-match@4.0.4: {} - baseline-browser-mapping@2.11.19: {} + baseline-browser-mapping@2.11.26: {} - beasties@0.4.3: + beasties@0.5.4: dependencies: - css-select: 6.0.0 - css-what: 7.0.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - htmlparser2: 10.1.0 + css-select: 7.0.0 + css-what: 8.0.0 + dom-serializer: 3.1.1 + domhandler: 6.0.1 + htmlparser2: 12.0.0 picocolors: 1.1.1 - postcss: 8.5.26 + postcss: 8.5.28 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.26) + postcss-safe-parser: 7.1.0(postcss@8.5.28) - body-parser@2.3.0(supports-color@8.1.1): - dependencies: - bytes: 3.1.2 - content-type: 2.1.0 - debug: 4.4.3(supports-color@8.1.1) - http-errors: 2.0.1 - iconv-lite: 0.7.3 - on-finished: 2.4.1 - qs: 6.15.3 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color - - boolbase@1.0.0: {} + boolbase@2.0.0: {} bootstrap@5.3.8(@popperjs/core@2.11.8): dependencies: '@popperjs/core': 2.11.8 - brace-expansion@1.1.18: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.1.4: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.9: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 - browserslist@4.28.8: + browserslist@4.29.1: dependencies: - baseline-browser-mapping: 2.11.19 - caniuse-lite: 1.0.30001810 - electron-to-chromium: 1.5.415 - node-releases: 2.0.53 - update-browserslist-db: 1.3.1(browserslist@4.28.8) + baseline-browser-mapping: 2.11.26 + caniuse-lite: 1.0.30001812 + electron-to-chromium: 1.5.439 + node-releases: 2.0.57 + update-browserslist-db: 1.3.3(browserslist@4.29.1) bs-logger@0.2.6: dependencies: @@ -6496,17 +6267,13 @@ snapshots: buffer-from@1.1.2: {} - bytes@3.1.2: {} - - call-bind-apply-helpers@1.0.2: + cacheable@2.5.0: dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 callsites@3.1.0: {} @@ -6514,7 +6281,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001810: {} + caniuse-lite@1.0.30001812: {} chalk@4.1.2: dependencies: @@ -6533,7 +6300,7 @@ snapshots: ci-info@4.4.0: {} - cjs-module-lexer@2.2.0: {} + cjs-module-lexer@2.2.1: {} cli-cursor@5.0.0: dependencies: @@ -6543,8 +6310,8 @@ snapshots: cli-truncate@6.1.1: dependencies: - slice-ansi: 9.0.0 - string-width: 8.2.2 + slice-ansi: 9.0.1 + string-width: 8.3.0 cli-width@4.1.0: {} @@ -6570,27 +6337,12 @@ snapshots: color-name@1.1.4: {} - concat-map@0.0.1: {} - - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - content-type@2.1.0: {} + colorjs.io@0.7.1: {} convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - create-require@1.1.1: {} cross-spawn@7.0.6: @@ -6599,15 +6351,15 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-select@6.0.0: + css-select@7.0.0: dependencies: - boolbase: 1.0.0 - css-what: 7.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 + boolbase: 2.0.0 + css-what: 8.0.0 + domhandler: 6.0.1 + domutils: 4.0.2 + nth-check: 3.0.1 - css-what@7.0.0: {} + css-what@8.0.0: {} cssstyle@4.6.0: dependencies: @@ -6633,8 +6385,6 @@ snapshots: deepmerge@4.3.1: {} - depd@2.0.0: {} - detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -6643,35 +6393,27 @@ snapshots: diff@4.0.4: {} - dom-serializer@2.0.0: + dom-serializer@3.1.1: dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 + domelementtype: 3.0.0 + domhandler: 6.0.1 + entities: 8.1.0 - domelementtype@2.3.0: {} + domelementtype@3.0.0: {} - domhandler@5.0.3: + domhandler@6.0.1: dependencies: - domelementtype: 2.3.0 + domelementtype: 3.0.0 - domutils@3.2.2: + domutils@4.0.2: dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 + dom-serializer: 3.1.1 + domelementtype: 3.0.0 + domhandler: 6.0.1 eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - - electron-to-chromium@1.5.415: {} + electron-to-chromium@1.5.439: {} emittery@0.13.1: {} @@ -6681,17 +6423,11 @@ snapshots: emoji-regex@9.2.2: {} - empathic@2.0.1: {} - - encodeurl@2.0.0: {} - - entities@4.5.0: {} + empathic@2.1.0: {} entities@6.0.1: {} - entities@7.0.1: {} - - entities@8.0.0: {} + entities@8.1.0: {} environment@1.1.0: {} @@ -6699,13 +6435,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 + es-module-lexer@2.3.2: {} esbuild-wasm@0.28.2: {} @@ -6740,8 +6470,6 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} @@ -6757,14 +6485,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1): + eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@8.1.1) '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/plugin-kit': 0.7.3 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -6779,7 +6507,7 @@ snapshots: esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 11.1.5 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 @@ -6814,14 +6542,6 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - - eventsource-parser@3.1.1: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.1 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -6845,46 +6565,14 @@ snapshots: jest-mock: 30.4.1 jest-util: 30.4.1 - express-rate-limit@8.6.2(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1): + expect@30.5.2: dependencies: - debug: 4.4.3(supports-color@8.1.1) - express: 5.2.1(supports-color@8.1.1) - ip-address: 10.5.0 - transitivePeerDependencies: - - supports-color - - express@5.2.1(supports-color@8.1.1): - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0(supports-color@8.1.1) - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3(supports-color@8.1.1) - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1(supports-color@8.1.1) - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.3 - range-parser: 1.3.0 - router: 2.2.0(supports-color@8.1.1) - send: 1.2.1(supports-color@8.1.1) - serve-static: 2.2.1(supports-color@8.1.1) - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + '@jest/expect-utils': 30.5.2 + '@jest/get-type': 30.5.0 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-util: 30.5.1 fast-deep-equal@3.1.3: {} @@ -6898,7 +6586,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} + fast-uri@3.1.8: {} fast-wrap-ansi@0.2.2: dependencies: @@ -6912,23 +6600,12 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - file-entry-cache@8.0.0: + file-entry-cache@11.1.5: dependencies: - flat-cache: 4.0.1 + flat-cache: 6.1.23 file-saver@2.0.5: {} - finalhandler@2.1.1(supports-color@8.1.1): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -6939,58 +6616,35 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@4.0.1: + flat-cache@6.1.23: dependencies: + cacheable: 2.5.0 flatted: 3.4.4 - keyv: 4.5.4 + hookified: 1.15.1 flatted@3.4.4: {} + flru@1.0.2: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forwarded@0.2.0: {} - - fresh@2.0.0: {} - - fs.realpath@1.0.0: {} - fsevents@2.3.2: optional: true fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 + get-east-asian-width@1.7.0: {} get-package-type@0.1.0: {} - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - get-stream@6.0.1: {} get-tsconfig@4.14.1: @@ -7010,16 +6664,11 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: + glob@13.0.6: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.2.0: {} + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 graceful-fs@4.2.11: {} @@ -7034,17 +6683,17 @@ snapshots: has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - hasown@2.0.4: + hashery@1.5.1: dependencies: - function-bind: 1.1.2 + hookified: 1.15.1 - hono@4.13.5: {} + hookified@1.15.1: {} + + hookified@2.2.0: {} hosted-git-info@10.1.1: dependencies: - lru-cache: 11.5.2 + lru-cache: 11.5.3 html-encoding-sniffer@4.0.0: dependencies: @@ -7052,20 +6701,12 @@ snapshots: html-escaper@2.0.2: {} - htmlparser2@10.1.0: + htmlparser2@12.0.0: dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 + domelementtype: 3.0.0 + domhandler: 6.0.1 + domutils: 4.0.2 + entities: 8.1.0 http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: @@ -7102,9 +6743,9 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.10: {} - ignore@7.0.6: {} + ignore@7.0.8: {} immutable@5.1.9: {} @@ -7117,17 +6758,6 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ip-address@10.5.0: {} - - ipaddr.js@1.9.1: {} - is-arrayish@0.2.1: {} is-extglob@2.1.1: {} @@ -7136,7 +6766,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 is-generator-fn@2.1.0: {} @@ -7148,8 +6778,6 @@ snapshots: is-potential-custom-element-name@1.0.1: {} - is-promise@4.0.0: {} - is-stream@2.0.1: {} is-unicode-supported@2.1.0: {} @@ -7193,31 +6821,31 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.4.1: + jest-changed-files@30.5.1: dependencies: execa: 5.1.1 - jest-util: 30.4.1 + jest-util: 30.5.1 p-limit: 3.1.0 - jest-circus@30.4.2(supports-color@8.1.1): + jest-circus@30.5.2(supports-color@8.1.1): dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1(supports-color@8.1.1) - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/environment': 30.5.2 + '@jest/expect': 30.5.2(supports-color@8.1.1) + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 30.4.1 - jest-matcher-utils: 30.4.1 - jest-message-util: 30.4.1 - jest-runtime: 30.4.2(supports-color@8.1.1) - jest-snapshot: 30.4.1(supports-color@8.1.1) - jest-util: 30.4.1 + jest-each: 30.5.2 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-runtime: 30.5.2(supports-color@8.1.1) + jest-snapshot: 30.5.2(supports-color@8.1.1) + jest-util: 30.5.1 p-limit: 3.1.0 - pretty-format: 30.4.1 + pretty-format: 30.5.1 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -7225,17 +6853,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)): + jest-cli@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)): dependencies: - '@jest/core': 30.4.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 + '@jest/core': 30.5.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) - jest-util: 30.4.1 - jest-validate: 30.4.1 + jest-config: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) + jest-util: 30.5.1 + jest-validate: 30.5.1 yargs: 17.7.3 transitivePeerDependencies: - '@types/node' @@ -7244,34 +6872,34 @@ snapshots: - supports-color - ts-node - jest-config@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)): + jest-config@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.4.0 - '@jest/test-sequencer': 30.4.1 - '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@jest/get-type': 30.5.0 + '@jest/pattern': 30.5.0 + '@jest/test-sequencer': 30.5.2 + '@jest/types': 30.5.1 + babel-jest: 30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 10.5.0 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-circus: 30.4.2(supports-color@8.1.1) - jest-docblock: 30.4.0 - jest-environment-node: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-runner: 30.4.2(supports-color@8.1.1) - jest-util: 30.4.1 - jest-validate: 30.4.1 + jest-circus: 30.5.2(supports-color@8.1.1) + jest-docblock: 30.5.0 + jest-environment-node: 30.5.2 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-runner: 30.5.2(supports-color@8.1.1) + jest-util: 30.5.1 + jest-validate: 30.5.1 parse-json: 5.2.0 - pretty-format: 30.4.1 + pretty-format: 30.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 26.4.0 - ts-node: 10.9.2(@types/node@26.4.0)(typescript@6.0.3) + '@types/node': 26.6.2 + ts-node: 10.9.2(@types/node@26.6.2)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -7290,54 +6918,62 @@ snapshots: chalk: 4.1.2 pretty-format: 30.4.1 - jest-docblock@30.4.0: + jest-diff@30.5.2: + dependencies: + '@jest/diff-sequences': 30.5.0 + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + pretty-format: 30.5.1 + + jest-docblock@30.5.0: dependencies: detect-newline: 3.1.0 - jest-each@30.4.1: + jest-each@30.5.2: dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 chalk: 4.1.2 - jest-util: 30.4.1 - pretty-format: 30.4.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + pretty-format: 30.5.1 - jest-environment-jsdom@30.4.1(supports-color@8.1.1): + jest-environment-jsdom@30.5.2(supports-color@8.1.1): dependencies: - '@jest/environment': 30.4.1 - '@jest/environment-jsdom-abstract': 30.4.1(jsdom@26.1.0(supports-color@8.1.1)) + '@jest/environment': 30.5.2 + '@jest/environment-jsdom-abstract': 30.5.2(@types/jsdom@21.1.7)(jsdom@26.1.0(supports-color@8.1.1)) + '@types/jsdom': 21.1.7 jsdom: 26.1.0(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jest-environment-node@30.4.1: + jest-environment-node@30.5.2: dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 26.4.0 - jest-mock: 30.4.1 - jest-util: 30.4.1 - jest-validate: 30.4.1 + '@jest/environment': 30.5.2 + '@jest/fake-timers': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 + jest-mock: 30.5.2 + jest-util: 30.5.1 + jest-validate: 30.5.1 jest-get-type@29.6.3: {} - jest-haste-map@30.4.1: + jest-haste-map@30.5.1: dependencies: - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/types': 30.5.1 + '@parcel/watcher': 2.6.0 + '@types/node': 26.6.2 anymatch: 3.1.3 fb-watchman: 2.0.2 + fdir: 6.5.0(picomatch@4.0.7) graceful-fs: 4.2.11 - jest-regex-util: 30.4.0 - jest-util: 30.4.1 - jest-worker: 30.4.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + jest-worker: 30.5.1 picomatch: 4.0.7 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 jest-junit@17.0.0: dependencies: @@ -7346,10 +6982,10 @@ snapshots: uuid: 14.0.2 xml: 1.0.1 - jest-leak-detector@30.4.1: + jest-leak-detector@30.5.1: dependencies: - '@jest/get-type': 30.1.0 - pretty-format: 30.4.1 + '@jest/get-type': 30.5.0 + pretty-format: 30.5.1 jest-matcher-utils@30.4.1: dependencies: @@ -7358,6 +6994,13 @@ snapshots: jest-diff: 30.4.1 pretty-format: 30.4.1 + jest-matcher-utils@30.5.2: + dependencies: + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + jest-diff: 30.5.2 + pretty-format: 30.5.1 + jest-message-util@30.4.1: dependencies: '@babel/code-frame': 7.29.7 @@ -7366,34 +7009,50 @@ snapshots: chalk: 4.1.2 graceful-fs: 4.2.11 jest-util: 30.4.1 - picomatch: 4.0.5 + picomatch: 4.0.7 pretty-format: 30.4.1 slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.5.1: + dependencies: + '@babel/code-frame': 7.29.7 + '@jest/types': 30.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.5.1 + picomatch: 4.0.7 + pretty-format: 30.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@types/node': 26.6.2 jest-util: 30.4.1 - jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): - optionalDependencies: - jest-resolve: 30.4.1 - - jest-preset-angular@17.0.0(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3): + jest-mock@30.5.2: dependencies: - '@angular/compiler-cli': 22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/platform-browser': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)) + '@jest/expect-utils': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 + jest-util: 30.5.1 + + jest-preset-angular@17.0.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(jsdom@26.1.0(supports-color@8.1.1))(typescript@6.0.3): + dependencies: + '@angular/compiler-cli': 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) '@jest/environment-jsdom-abstract': 30.4.1(jsdom@26.1.0(supports-color@8.1.1)) bs-logger: 0.2.6 esbuild-wasm: 0.28.2 - jest: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) + jest: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) jest-util: 30.4.1 jsdom: 26.1.0(supports-color@8.1.1) pretty-format: 30.4.1 - ts-jest: 29.4.12(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(typescript@6.0.3) + ts-jest: 29.4.12(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(typescript@6.0.3) typescript: 6.0.3 optionalDependencies: esbuild: 0.28.2 @@ -7406,99 +7065,101 @@ snapshots: jest-regex-util@30.4.0: {} - jest-resolve-dependencies@30.4.2(supports-color@8.1.1): + jest-regex-util@30.5.0: {} + + jest-resolve-dependencies@30.5.2(supports-color@8.1.1): dependencies: - jest-regex-util: 30.4.0 - jest-snapshot: 30.4.1(supports-color@8.1.1) + jest-regex-util: 30.5.0 + jest-snapshot: 30.5.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color - jest-resolve@30.4.1: + jest-resolve@30.5.1: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-pnp-resolver: 1.2.3(jest-resolve@30.4.1) - jest-util: 30.4.1 - jest-validate: 30.4.1 + jest-haste-map: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 slash: 3.0.0 unrs-resolver: 1.12.2 - jest-runner@30.4.2(supports-color@8.1.1): + jest-runner@30.5.2(supports-color@8.1.1): dependencies: - '@jest/console': 30.4.1 - '@jest/environment': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/console': 30.5.2 + '@jest/environment': 30.5.2 + '@jest/source-map': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 + '@types/node': 26.6.2 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 30.4.0 - jest-environment-node: 30.4.1 - jest-haste-map: 30.4.1 - jest-leak-detector: 30.4.1 - jest-message-util: 30.4.1 - jest-resolve: 30.4.1 - jest-runtime: 30.4.2(supports-color@8.1.1) - jest-util: 30.4.1 - jest-watcher: 30.4.1 - jest-worker: 30.4.1 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.2 + jest-haste-map: 30.5.1 + jest-leak-detector: 30.5.1 + jest-message-util: 30.5.1 + jest-resolve: 30.5.1 + jest-runtime: 30.5.2(supports-color@8.1.1) + jest-util: 30.5.1 + jest-watcher: 30.5.2 + jest-worker: 30.5.1 p-limit: 3.1.0 - source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.4.2(supports-color@8.1.1): + jest-runtime@30.5.2(supports-color@8.1.1): dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/globals': 30.4.1(supports-color@8.1.1) - '@jest/source-map': 30.0.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/environment': 30.5.2 + '@jest/fake-timers': 30.5.2 + '@jest/globals': 30.5.2(supports-color@8.1.1) + '@jest/source-map': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 + '@types/node': 26.6.2 chalk: 4.1.2 - cjs-module-lexer: 2.2.0 + cjs-module-lexer: 2.2.1 collect-v8-coverage: 1.0.3 - glob: 10.5.0 + es-module-lexer: 2.3.2 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-message-util: 30.4.1 - jest-mock: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-snapshot: 30.4.1(supports-color@8.1.1) - jest-util: 30.4.1 + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-snapshot: 30.5.2(supports-color@8.1.1) + jest-util: 30.5.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.4.1(supports-color@8.1.1): + jest-snapshot@30.5.2(supports-color@8.1.1): dependencies: '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.8 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/types': 7.29.8 - '@jest/expect-utils': 30.4.1 - '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.4.1 - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 + '@jest/expect-utils': 30.5.2 + '@jest/get-type': 30.5.0 + '@jest/snapshot-utils': 30.5.1 + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7(supports-color@8.1.1)) chalk: 4.1.2 - expect: 30.4.1 + expect: 30.5.2 graceful-fs: 4.2.11 - jest-diff: 30.4.1 - jest-matcher-utils: 30.4.1 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - pretty-format: 30.4.1 + jest-diff: 30.5.2 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + pretty-format: 30.5.1 semver: 7.8.5 synckit: 0.11.13 transitivePeerDependencies: @@ -7507,30 +7168,39 @@ snapshots: jest-util@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@types/node': 26.6.2 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.7 - jest-validate@30.4.1: + jest-util@30.5.1: dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.7 + + jest-validate@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.4.1 + pretty-format: 30.5.1 - jest-watcher@30.4.1: + jest-watcher@30.5.2: dependencies: - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 26.4.0 + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 26.6.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.4.1 + jest-util: 30.5.1 string-length: 4.0.2 jest-websocket-mock@2.5.0: @@ -7538,20 +7208,20 @@ snapshots: jest-diff: 29.7.0 mock-socket: 9.3.1 - jest-worker@30.4.1: + jest-worker@30.5.1: dependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 '@ungap/structured-clone': 1.3.3 - jest-util: 30.4.1 + jest-util: 30.5.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)): + jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)): dependencies: - '@jest/core': 30.4.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) - '@jest/types': 30.4.1 + '@jest/core': 30.5.2(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) + '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) + jest-cli: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -7561,8 +7231,6 @@ snapshots: jiti@2.7.0: {} - jose@6.2.10: {} - js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -7601,25 +7269,21 @@ snapshots: jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} jsonc-parser@3.3.1: {} - keyv@4.5.4: + keyv@5.6.0: dependencies: - json-buffer: 3.0.1 + '@keyv/serialize': 1.1.1 leven@3.1.0: {} @@ -7679,11 +7343,11 @@ snapshots: lines-and-columns@1.2.4: {} - listr2@11.0.0: + listr2@11.1.0: dependencies: cli-truncate: 6.1.1 log-update: 8.0.0 - wrap-ansi: 10.0.1 + wrap-ansi: 10.0.2 lmdb@3.5.6: dependencies: @@ -7691,7 +7355,7 @@ snapshots: msgpackr: 1.12.1 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.1 + ordered-binary: 1.6.2 weak-lru-cache: 1.2.2 optionalDependencies: '@lmdb/lmdb-darwin-arm64': 3.5.6 @@ -7726,14 +7390,14 @@ snapshots: dependencies: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 - slice-ansi: 9.0.0 - string-width: 8.2.2 + slice-ansi: 9.0.1 + string-width: 8.3.0 strip-ansi: 7.2.0 - wrap-ansi: 10.0.1 + wrap-ansi: 10.0.2 lru-cache@10.4.3: {} - lru-cache@11.5.2: {} + lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: @@ -7741,7 +7405,11 @@ snapshots: magic-string@1.0.0: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.4.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 make-dir@4.0.0: dependencies: @@ -7749,39 +7417,21 @@ snapshots: make-error@1.3.6: {} - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 + marked@18.0.14: {} material-colors@1.2.6: {} - math-intrinsics@1.1.0: {} - - media-typer@1.1.1: {} - - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} - mime-db@1.54.0: {} - mime-names@1.0.0: {} - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - mimic-fn@2.1.0: {} mimic-function@5.0.1: {} minimatch@10.2.6: dependencies: - brace-expansion: 5.0.9 - - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.18 + brace-expansion: 5.0.12 minimatch@9.0.9: dependencies: @@ -7824,52 +7474,48 @@ snapshots: natural-compare@1.4.0: {} - negotiator@1.1.0: - dependencies: - content-type: 2.1.0 - neo-async@2.6.2: {} - ngx-bootstrap-icons@1.9.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)): + ngx-bootstrap-icons@1.9.3(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) tslib: 2.8.1 - ngx-color@10.1.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)): + ngx-color@10.1.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) '@ctrl/tinycolor': 4.2.0 material-colors: 1.2.6 tslib: 2.8.1 - ngx-cookie-service@22.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)): + ngx-cookie-service@22.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) tslib: 2.8.1 - ngx-device-detector@12.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)): + ngx-device-detector@12.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) tslib: 2.8.1 - ngx-ui-tour-core@17.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(rxjs@7.8.2): + ngx-ui-tour-core@17.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(rxjs@7.8.2): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@angular/router': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/router': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 - ngx-ui-tour-ng-bootstrap@19.0.0(55dd56417d8b845704494a1b92156fbd): + ngx-ui-tour-ng-bootstrap@19.0.0(cd8c036435da1b7a89d66e1b1b6d40d2): dependencies: - '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) - '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) - '@ng-bootstrap/ng-bootstrap': 21.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@popperjs/core@2.11.8)(rxjs@7.8.2) - ngx-ui-tour-core: 17.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@ng-bootstrap/ng-bootstrap': 21.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2) + ngx-ui-tour-core: 17.0.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2))(rxjs@7.8.2) tslib: 2.8.1 transitivePeerDependencies: - '@angular/router' @@ -7878,8 +7524,7 @@ snapshots: node-addon-api@6.1.0: optional: true - node-addon-api@7.1.1: - optional: true + node-addon-api@7.1.1: {} node-gyp-build-optional-packages@5.2.2: dependencies: @@ -7888,7 +7533,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.53: {} + node-releases@2.0.57: {} normalize-diacritics@5.0.0: dependencies: @@ -7907,25 +7552,13 @@ snapshots: dependencies: path-key: 3.1.1 - nth-check@2.1.1: + nth-check@3.0.1: dependencies: - boolbase: 1.0.0 + boolbase: 2.0.0 nwsapi@2.2.24: {} - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - obug@2.1.4: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 + obug@2.2.1: {} onetime@5.1.2: dependencies: @@ -7953,35 +7586,34 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.2 + string-width: 8.3.0 - ordered-binary@1.6.1: + ordered-binary@1.6.2: optional: true - oxc-parser@0.142.0: + oxc-parser@0.150.0: dependencies: - '@oxc-project/types': 0.142.0 + '@oxc-project/types': 0.150.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.142.0 - '@oxc-parser/binding-android-arm64': 0.142.0 - '@oxc-parser/binding-darwin-arm64': 0.142.0 - '@oxc-parser/binding-darwin-x64': 0.142.0 - '@oxc-parser/binding-freebsd-x64': 0.142.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.142.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.142.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.142.0 - '@oxc-parser/binding-linux-arm64-musl': 0.142.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.142.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.142.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.142.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.142.0 - '@oxc-parser/binding-linux-x64-gnu': 0.142.0 - '@oxc-parser/binding-linux-x64-musl': 0.142.0 - '@oxc-parser/binding-openharmony-arm64': 0.142.0 - '@oxc-parser/binding-wasm32-wasi': 0.142.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.142.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.142.0 - '@oxc-parser/binding-win32-x64-msvc': 0.142.0 + '@oxc-parser/binding-android-arm-eabi': 0.150.0 + '@oxc-parser/binding-android-arm64': 0.150.0 + '@oxc-parser/binding-darwin-arm64': 0.150.0 + '@oxc-parser/binding-darwin-x64': 0.150.0 + '@oxc-parser/binding-freebsd-x64': 0.150.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.150.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.150.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.150.0 + '@oxc-parser/binding-linux-arm64-musl': 0.150.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.150.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.150.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.150.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.150.0 + '@oxc-parser/binding-linux-x64-gnu': 0.150.0 + '@oxc-parser/binding-linux-x64-musl': 0.150.0 + '@oxc-parser/binding-openharmony-arm64': 0.150.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.150.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.150.0 + '@oxc-parser/binding-win32-x64-msvc': 0.150.0 p-limit@2.3.0: dependencies: @@ -8014,7 +7646,7 @@ snapshots: parse5-html-rewriting-stream@8.0.1: dependencies: - entities: 8.0.0 + entities: 8.1.0 parse5: 8.0.1 parse5-sax-parser: 8.0.0 @@ -8028,14 +7660,10 @@ snapshots: parse5@8.0.1: dependencies: - entities: 8.0.0 - - parseurl@1.3.3: {} + entities: 8.1.0 path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-scurry@1.11.1: @@ -8043,11 +7671,14 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - path-to-regexp@8.4.2: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.3 + minipass: 7.1.3 - pdfjs-dist@6.2.108: + pdfjs-dist@6.3.289: optionalDependencies: - '@napi-rs/canvas': 1.0.5 + '@napi-rs/canvas': 1.0.9 picocolors@1.1.1: {} @@ -8059,12 +7690,10 @@ snapshots: pirates@4.0.7: {} - piscina@5.2.0: + piscina@5.3.2: optionalDependencies: '@napi-rs/nice': 1.1.1 - pkce-challenge@5.0.1: {} - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -8079,11 +7708,11 @@ snapshots: postcss-media-query-parser@0.2.3: {} - postcss-safe-parser@7.0.1(postcss@8.5.26): + postcss-safe-parser@7.1.0(postcss@8.5.28): dependencies: - postcss: 8.5.26 + postcss: 8.5.28 - postcss@8.5.26: + postcss@8.5.28: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 @@ -8091,12 +7720,12 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-organize-imports@4.3.0(prettier@3.9.6)(typescript@6.0.3): + prettier-plugin-organize-imports@4.3.0(prettier@3.9.9)(typescript@6.0.3): dependencies: - prettier: 3.9.6 + prettier: 3.9.9 typescript: 6.0.3 - prettier@3.9.6: {} + prettier@3.9.9: {} pretty-format@29.7.0: dependencies: @@ -8109,38 +7738,30 @@ snapshots: '@jest/schemas': 30.4.1 ansi-styles: 5.2.0 react-is-18: react-is@18.3.1 - react-is-19: react-is@19.2.8 + react-is-19: react-is@19.3.0 + + pretty-format@30.5.1: + dependencies: + '@jest/react-is-18': react-is@18.3.1 + '@jest/react-is-19': react-is@19.3.0 + '@jest/schemas': 30.5.0 + ansi-styles: 5.2.0 proc-log@7.0.0: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-agent-negotiate@1.1.0: {} punycode@2.3.1: {} pure-rand@7.0.1: {} - qs@6.15.3: + qified@0.10.1: dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 - - range-parser@1.3.0: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.3 - unpipe: 1.0.0 + hookified: 2.2.0 react-is@18.3.1: {} - react-is@19.2.8: {} + react-is@19.3.0: {} readdirp@5.1.1: {} @@ -8163,57 +7784,26 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - rolldown@1.1.5: + rolldown@1.2.8: dependencies: - '@oxc-project/types': 0.139.0 + '@oxc-project/types': 0.149.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.5 - '@rolldown/binding-darwin-arm64': 1.1.5 - '@rolldown/binding-darwin-x64': 1.1.5 - '@rolldown/binding-freebsd-x64': 1.1.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 - '@rolldown/binding-linux-arm64-gnu': 1.1.5 - '@rolldown/binding-linux-arm64-musl': 1.1.5 - '@rolldown/binding-linux-ppc64-gnu': 1.1.5 - '@rolldown/binding-linux-s390x-gnu': 1.1.5 - '@rolldown/binding-linux-x64-gnu': 1.1.5 - '@rolldown/binding-linux-x64-musl': 1.1.5 - '@rolldown/binding-openharmony-arm64': 1.1.5 - '@rolldown/binding-wasm32-wasi': 1.1.5 - '@rolldown/binding-win32-arm64-msvc': 1.1.5 - '@rolldown/binding-win32-x64-msvc': 1.1.5 - - rolldown@1.2.0: - dependencies: - '@oxc-project/types': 0.140.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.0 - '@rolldown/binding-darwin-arm64': 1.2.0 - '@rolldown/binding-darwin-x64': 1.2.0 - '@rolldown/binding-freebsd-x64': 1.2.0 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.0 - '@rolldown/binding-linux-arm64-gnu': 1.2.0 - '@rolldown/binding-linux-arm64-musl': 1.2.0 - '@rolldown/binding-linux-ppc64-gnu': 1.2.0 - '@rolldown/binding-linux-s390x-gnu': 1.2.0 - '@rolldown/binding-linux-x64-gnu': 1.2.0 - '@rolldown/binding-linux-x64-musl': 1.2.0 - '@rolldown/binding-openharmony-arm64': 1.2.0 - '@rolldown/binding-wasm32-wasi': 1.2.0 - '@rolldown/binding-win32-arm64-msvc': 1.2.0 - '@rolldown/binding-win32-x64-msvc': 1.2.0 - - router@2.2.0(supports-color@8.1.1): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color + '@rolldown/binding-android-arm-eabi': 1.2.8 + '@rolldown/binding-android-arm64': 1.2.8 + '@rolldown/binding-darwin-arm64': 1.2.8 + '@rolldown/binding-darwin-x64': 1.2.8 + '@rolldown/binding-freebsd-x64': 1.2.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.8 + '@rolldown/binding-linux-arm64-gnu': 1.2.8 + '@rolldown/binding-linux-arm64-musl': 1.2.8 + '@rolldown/binding-linux-ppc64-gnu': 1.2.8 + '@rolldown/binding-linux-s390x-gnu': 1.2.8 + '@rolldown/binding-linux-x64-gnu': 1.2.8 + '@rolldown/binding-linux-x64-musl': 1.2.8 + '@rolldown/binding-openharmony-arm64': 1.2.8 + '@rolldown/binding-win32-arm64-msvc': 1.2.8 + '@rolldown/binding-win32-x64-msvc': 1.2.8 rrweb-cssom@0.8.0: {} @@ -8223,7 +7813,94 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.101.0: + sass-embedded-all-unknown@1.104.1: + dependencies: + sass: 1.104.1 + optional: true + + sass-embedded-android-arm64@1.104.1: + optional: true + + sass-embedded-android-arm@1.104.1: + optional: true + + sass-embedded-android-riscv64@1.104.1: + optional: true + + sass-embedded-android-x64@1.104.1: + optional: true + + sass-embedded-darwin-arm64@1.104.1: + optional: true + + sass-embedded-darwin-x64@1.104.1: + optional: true + + sass-embedded-linux-arm64@1.104.1: + optional: true + + sass-embedded-linux-arm@1.104.1: + optional: true + + sass-embedded-linux-musl-arm64@1.104.1: + optional: true + + sass-embedded-linux-musl-arm@1.104.1: + optional: true + + sass-embedded-linux-musl-riscv64@1.104.1: + optional: true + + sass-embedded-linux-musl-x64@1.104.1: + optional: true + + sass-embedded-linux-riscv64@1.104.1: + optional: true + + sass-embedded-linux-x64@1.104.1: + optional: true + + sass-embedded-unknown-all@1.104.1: + dependencies: + sass: 1.104.1 + optional: true + + sass-embedded-win32-arm64@1.104.1: + optional: true + + sass-embedded-win32-x64@1.104.1: + optional: true + + sass-embedded@1.104.1: + dependencies: + '@bufbuild/protobuf': 2.15.0 + colorjs.io: 0.7.1 + immutable: 5.1.9 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 + optionalDependencies: + sass-embedded-all-unknown: 1.104.1 + sass-embedded-android-arm: 1.104.1 + sass-embedded-android-arm64: 1.104.1 + sass-embedded-android-riscv64: 1.104.1 + sass-embedded-android-x64: 1.104.1 + sass-embedded-darwin-arm64: 1.104.1 + sass-embedded-darwin-x64: 1.104.1 + sass-embedded-linux-arm: 1.104.1 + sass-embedded-linux-arm64: 1.104.1 + sass-embedded-linux-musl-arm: 1.104.1 + sass-embedded-linux-musl-arm64: 1.104.1 + sass-embedded-linux-musl-riscv64: 1.104.1 + sass-embedded-linux-musl-x64: 1.104.1 + sass-embedded-linux-riscv64: 1.104.1 + sass-embedded-linux-x64: 1.104.1 + sass-embedded-unknown-all: 1.104.1 + sass-embedded-win32-arm64: 1.104.1 + sass-embedded-win32-x64: 1.104.1 + + sass@1.104.1: dependencies: chokidar: 5.0.0 immutable: 5.1.9 @@ -8239,85 +7916,25 @@ snapshots: semver@7.8.5: {} - send@1.2.1(supports-color@8.1.1): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.3.0 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1(supports-color@8.1.1): - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: {} signal-exit@4.1.0: {} slash@3.0.0: {} - slice-ansi@9.0.0: + slice-ansi@9.0.1: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8327,14 +7944,14 @@ snapshots: source-map@0.7.6: {} + source-map@0.8.0: {} + sprintf-js@1.0.3: {} stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - statuses@2.0.2: {} - stdin-discarder@0.3.2: {} string-length@4.0.2: @@ -8357,12 +7974,12 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string-width@8.2.2: + string-width@8.3.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 strip-ansi@6.0.1: @@ -8389,15 +8006,21 @@ snapshots: symbol-tree@3.2.4: {} + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.2.0 + + sync-message-port@1.2.0: {} + synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 - test-exclude@6.0.0: + test-exclude@7.0.2: dependencies: '@istanbuljs/schema': 0.1.6 - glob: 7.2.3 - minimatch: 3.1.5 + glob: 10.5.0 + minimatch: 10.2.6 tinyglobby@0.2.17: dependencies: @@ -8410,10 +8033,6 @@ snapshots: dependencies: tldts-core: 6.1.86 - tmpl@1.0.5: {} - - toidentifier@1.0.1: {} - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -8426,12 +8045,12 @@ snapshots: dependencies: typescript: 6.0.3 - ts-jest@29.4.12(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.4.1(supports-color@8.1.1))(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)))(typescript@6.0.3): + ts-jest@29.4.12(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@30.5.2(supports-color@8.1.1))(@jest/types@30.5.1)(babel-jest@30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.9 - jest: 30.4.2(@types/node@26.4.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3)) + jest: 30.5.2(@types/node@26.6.2)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -8441,20 +8060,20 @@ snapshots: yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.7(supports-color@8.1.1) - '@jest/transform': 30.4.1(supports-color@8.1.1) - '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@jest/transform': 30.5.2(supports-color@8.1.1) + '@jest/types': 30.5.1 + babel-jest: 30.5.2(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) esbuild: 0.28.2 jest-util: 30.4.1 - ts-node@10.9.2(@types/node@26.4.0)(typescript@6.0.3): + ts-node@10.9.2(@types/node@26.6.2)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 26.4.0 + '@types/node': 26.6.2 acorn: 8.18.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -8477,20 +8096,12 @@ snapshots: type-fest@4.41.0: {} - type-is@2.1.0: - dependencies: - content-type: 2.1.0 - media-typer: 1.1.1 - mime-types: 3.0.2 - typescript@6.0.3: {} uglify-js@3.19.3: optional: true - undici-types@8.3.0: {} - - unpipe@1.0.0: {} + undici-types@8.9.0: {} unrs-resolver@1.12.2: dependencies: @@ -8519,9 +8130,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - update-browserslist-db@1.3.1(browserslist@4.28.8): + update-browserslist-db@1.3.3(browserslist@4.29.1): dependencies: - browserslist: 4.28.8 + browserslist: 4.29.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -8545,34 +8156,29 @@ snapshots: validate-npm-package-name@8.0.0: {} - vary@1.1.2: {} + varint@6.0.0: {} - vite@8.1.5(@types/node@26.4.0)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0): + verkit@0.3.2: {} + + vite@8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 - postcss: 8.5.26 - rolldown: 1.1.5 + postcss: 8.5.28 + rolldown: 1.2.8 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.6.2 esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 - sass: 1.101.0 + sass: 1.104.1 + sass-embedded: 1.104.1 w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - watchpack@2.5.2: - dependencies: - graceful-fs: 4.2.11 - weak-lru-cache@1.2.2: optional: true @@ -8597,10 +8203,10 @@ snapshots: wordwrap@1.0.0: {} - wrap-ansi@10.0.1: + wrap-ansi@10.0.2: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.2 + string-width: 8.3.0 wrap-ansi@7.0.0: dependencies: @@ -8620,8 +8226,6 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 @@ -8635,6 +8239,8 @@ snapshots: xmlchars@2.2.0: {} + xxhash-wasm@1.1.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -8658,7 +8264,16 @@ snapshots: cliui: 9.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 - string-width: 8.2.2 + string-width: 8.3.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yargs@18.2.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.3.0 y18n: 5.0.8 yargs-parser: 22.0.0 @@ -8668,8 +8283,4 @@ snapshots: yoctocolors@2.2.0: {} - zod-to-json-schema@3.25.2(zod@4.4.3): - dependencies: - zod: 4.4.3 - - zod@4.4.3: {} + zod@4.6.5: {} diff --git a/src-ui/src/app/app-routing.module.ts b/src-ui/src/app/app-routing.module.ts index e329b8f00..993ba32d1 100644 --- a/src-ui/src/app/app-routing.module.ts +++ b/src-ui/src/app/app-routing.module.ts @@ -16,6 +16,7 @@ import { MailComponent } from './components/manage/mail/mail.component' import { OcrTemplateEditorComponent } from './components/manage/ocr-templates/ocr-template-editor/ocr-template-editor.component' import { OcrTemplatesComponent } from './components/manage/ocr-templates/ocr-templates.component' import { SavedViewsComponent } from './components/manage/saved-views/saved-views.component' +import { ShareLinksComponent } from './components/manage/share-links/share-links.component' import { WorkflowsComponent } from './components/manage/workflows/workflows.component' import { NotFoundComponent } from './components/not-found/not-found.component' import { DirtyDocGuard } from './guards/dirty-doc.guard' @@ -348,6 +349,24 @@ export const routes: Routes = [ componentName: 'SavedViewsComponent', }, }, + { + path: 'share-links', + component: ShareLinksComponent, + canActivate: [PermissionsGuard], + data: { + requiredPermissionAny: [ + { + action: PermissionAction.View, + type: PermissionType.ShareLink, + }, + { + action: PermissionAction.View, + type: PermissionType.ShareLinkBundle, + }, + ], + componentName: 'ShareLinksComponent', + }, + }, ], }, diff --git a/src-ui/src/app/app.component.spec.ts b/src-ui/src/app/app.component.spec.ts index 721aa37b3..d93534d80 100644 --- a/src-ui/src/app/app.component.spec.ts +++ b/src-ui/src/app/app.component.spec.ts @@ -19,6 +19,7 @@ import { PermissionsGuard } from './guards/permissions.guard' import { HotKeyService } from './services/hot-key.service' import { PermissionsService } from './services/permissions.service' import { SettingsService } from './services/settings.service' +import { TasksService } from './services/tasks.service' import { Toast, ToastService } from './services/toast.service' import { FileStatus, @@ -34,6 +35,7 @@ describe('AppComponent', () => { let toastService: ToastService let router: Router let settingsService: SettingsService + let tasksService: TasksService let hotKeyService: HotKeyService beforeEach(async () => { @@ -60,6 +62,7 @@ describe('AppComponent', () => { websocketStatusService = TestBed.inject(WebsocketStatusService) permissionsService = TestBed.inject(PermissionsService) settingsService = TestBed.inject(SettingsService) + tasksService = TestBed.inject(TasksService) toastService = TestBed.inject(ToastService) router = TestBed.inject(Router) hotKeyService = TestBed.inject(HotKeyService) @@ -117,30 +120,33 @@ describe('AppComponent', () => { expect(toast.action).toBeUndefined() }) - it('should display toast on document added', () => { - jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + it('should only reload tasks when a document is detected', () => { const toastSpy = jest.spyOn(toastService, 'show') + const reloadSpy = jest.spyOn(tasksService, 'reload') const fileStatusSubject = new Subject() jest .spyOn(websocketStatusService, 'onDocumentDetected') .mockReturnValue(fileStatusSubject) component.ngOnInit() fileStatusSubject.next(new FileStatus()) - expect(toastSpy).toHaveBeenCalled() + expect(reloadSpy).toHaveBeenCalled() + expect(toastSpy).not.toHaveBeenCalled() }) - it('should suppress dashboard notifications if set', () => { + it('should add consumed documents to the bell without a popup', () => { jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) - jest.spyOn(settingsService, 'get').mockReturnValue(true) - jest.spyOn(router, 'url', 'get').mockReturnValue('/dashboard') - const toastSpy = jest.spyOn(toastService, 'show') + const popupSpy = jest.fn() + toastService.showToast.subscribe(popupSpy) + let toasts: Toast[] = [] + toastService.getToasts().subscribe((t) => (toasts = [...t])) const fileStatusSubject = new Subject() jest - .spyOn(websocketStatusService, 'onDocumentDetected') + .spyOn(websocketStatusService, 'onDocumentConsumptionFinished') .mockReturnValue(fileStatusSubject) component.ngOnInit() fileStatusSubject.next(new FileStatus()) - expect(toastSpy).not.toHaveBeenCalled() + expect(toasts).toHaveLength(1) + expect(popupSpy).not.toHaveBeenCalled() }) it('should display toast on document failed', () => { diff --git a/src-ui/src/app/app.component.ts b/src-ui/src/app/app.component.ts index 6af7edf85..b3a004f28 100644 --- a/src-ui/src/app/app.component.ts +++ b/src-ui/src/app/app.component.ts @@ -14,7 +14,7 @@ import { } from './services/permissions.service' import { SettingsService } from './services/settings.service' import { TasksService } from './services/tasks.service' -import { ToastService } from './services/toast.service' +import { ToastLevel, ToastService } from './services/toast.service' import { WebsocketStatusService } from './services/websocket-status.service' @Component({ @@ -61,18 +61,6 @@ export class AppComponent implements OnInit, OnDestroy { } } - private showNotification(key) { - if ( - this.router.url == '/dashboard' && - this.settings.get( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD - ) - ) { - return false - } - return this.settings.get(key) - } - ngOnInit(): void { this.websocketStatusService.connect() @@ -80,29 +68,22 @@ export class AppComponent implements OnInit, OnDestroy { .onDocumentConsumptionFinished() .subscribe((status) => { this.tasksService.reload() - if ( - this.showNotification(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS) - ) { - if ( - this.permissionsService.currentUserCan( - PermissionAction.View, - PermissionType.Document - ) - ) { - this.toastService.show({ - content: $localize`Document ${status.filename} was added to Paperless-ngx.`, - delay: 10000, - actionName: $localize`Open document`, - action: () => { - this.router.navigate(['documents', status.documentId]) - }, - }) - } else { - this.toastService.show({ - content: $localize`Document ${status.filename} was added to Paperless-ngx.`, - delay: 10000, - }) - } + if (this.settings.get(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS)) { + const canView = this.permissionsService.currentUserCan( + PermissionAction.View, + PermissionType.Document + ) + // the upload status tray already shows this, so only keep a record + this.toastService.show({ + content: $localize`Document ${status.filename} was added to Paperless-ngx.`, + delay: 10000, + level: ToastLevel.Success, + silent: true, + actionName: canView ? $localize`Open document` : undefined, + action: canView + ? () => this.router.navigate(['documents', status.documentId]) + : undefined, + }) } }) @@ -110,9 +91,7 @@ export class AppComponent implements OnInit, OnDestroy { .onDocumentConsumptionFailed() .subscribe((status) => { this.tasksService.reload() - if ( - this.showNotification(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_FAILED) - ) { + if (this.settings.get(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_FAILED)) { this.toastService.showError( $localize`Could not add ${status.filename}\: ${status.message}` ) @@ -121,18 +100,8 @@ export class AppComponent implements OnInit, OnDestroy { this.newDocumentSubscription = this.websocketStatusService .onDocumentDetected() - .subscribe((status) => { + .subscribe(() => { this.tasksService.reload() - if ( - this.showNotification( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_NEW_DOCUMENT - ) - ) { - this.toastService.show({ - content: $localize`Document ${status.filename} is being processed by Paperless-ngx.`, - delay: 5000, - }) - } }) this.hotKeyService diff --git a/src-ui/src/app/components/admin/config/config.component.ts b/src-ui/src/app/components/admin/config/config.component.ts index 570eb7d55..6894a50be 100644 --- a/src-ui/src/app/components/admin/config/config.component.ts +++ b/src-ui/src/app/components/admin/config/config.component.ts @@ -190,7 +190,7 @@ export class ConfigComponent this.initialize(config) this.store.next(config) this.settingsService.initializeSettings().subscribe() - this.toastService.showInfo($localize`Configuration updated`) + this.toastService.showSuccess($localize`Configuration updated`) }, error: (e) => { this.loading.set(false) @@ -217,7 +217,7 @@ export class ConfigComponent this.initialize(config) this.store.next(config) this.settingsService.initializeSettings().subscribe() - this.toastService.showInfo($localize`File successfully updated`) + this.toastService.showSuccess($localize`File successfully updated`) }, error: (e) => { this.loading.set(false) diff --git a/src-ui/src/app/components/admin/settings/settings.component.html b/src-ui/src/app/components/admin/settings/settings.component.html index 305bb8a96..89ea62c3e 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.html +++ b/src-ui/src/app/components/admin/settings/settings.component.html @@ -112,6 +112,22 @@ +

Sidebar items to show:

+ @for (option of sidebarItemOptions; track option.id) { +
+ + +
+ } +
@@ -237,6 +253,24 @@ + @if (aiEnabled) { +
+
+ Suggestions default to +
+
+
+ + + + + + +
+
+
+ } +
@@ -391,10 +425,8 @@
- - + -
diff --git a/src-ui/src/app/components/admin/settings/settings.component.spec.ts b/src-ui/src/app/components/admin/settings/settings.component.spec.ts index 7b65281d0..d64ea2a9b 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.spec.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.spec.ts @@ -24,7 +24,7 @@ import { SystemStatus, SystemStatusItemStatus, } from 'src/app/data/system-status' -import { SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { HideableSidebarItemID, SETTINGS_KEYS } from 'src/app/data/ui-settings' import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' @@ -209,6 +209,45 @@ describe('SettingsComponent', () => { fixture.detectChanges() } + it('supports configuring sidebar items and canceling changes', () => { + completeSetup() + + component.toggleSidebarItem(HideableSidebarItemID.Workflows, false) + fixture.detectChanges() + + expect(component.settingsForm.value.sidebarHiddenItems).toContain( + HideableSidebarItemID.Workflows + ) + + settingsService.updateSidebarItemVisibility( + HideableSidebarItemID.Mail, + false + ) + + expect(component.settingsForm.value.sidebarHiddenItems).toContain( + HideableSidebarItemID.Mail + ) + + component.reset() + + expect(component.settingsForm.value.sidebarHiddenItems).not.toContain( + HideableSidebarItemID.Workflows + ) + expect(component.settingsForm.value.sidebarHiddenItems).not.toContain( + HideableSidebarItemID.Mail + ) + }) + + it('enables sidebar item controls on general settings until destroyed', () => { + completeSetup() + + expect(settingsService.organizingSidebarItems()).toBe(true) + + component.ngOnDestroy() + + expect(settingsService.organizingSidebarItems()).toBe(false) + }) + it('should support tabbed settings & change URL, prevent navigation if dirty confirmation rejected', async () => { completeSetup() const navigateSpy = jest.spyOn(router, 'navigate') @@ -249,6 +288,7 @@ describe('SettingsComponent', () => { it('should support save local settings updating appearance settings and calling API, show error', () => { completeSetup() + component.toggleSidebarItem(HideableSidebarItemID.Workflows, false) const toastErrorSpy = jest.spyOn(toastService, 'showError') const toastSpy = jest.spyOn(toastService, 'show') const storeSpy = jest.spyOn(settingsService, 'storeSettings') @@ -268,6 +308,9 @@ describe('SettingsComponent', () => { expect(storeSpy).toHaveBeenCalled() expect(appearanceSettingsSpy).not.toHaveBeenCalled() expect(setSpy).toHaveBeenCalledTimes(33) + expect(setSpy).toHaveBeenCalledWith(SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, [ + HideableSidebarItemID.Workflows, + ]) // succeed storeSpy.mockReturnValueOnce(of(true)) diff --git a/src-ui/src/app/components/admin/settings/settings.component.ts b/src-ui/src/app/components/admin/settings/settings.component.ts index 218f6683c..886e47ad6 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.ts @@ -39,7 +39,13 @@ import { SystemStatus, SystemStatusItemStatus, } from 'src/app/data/system-status' -import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { + GlobalSearchType, + HIDEABLE_SIDEBAR_ITEM_IDS, + HideableSidebarItemID, + SETTINGS_KEYS, + SuggestionSource, +} from 'src/app/data/ui-settings' import { User } from 'src/app/data/user' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' @@ -57,7 +63,7 @@ import { SettingsService, } from 'src/app/services/settings.service' import { SystemStatusService } from 'src/app/services/system-status.service' -import { Toast, ToastService } from 'src/app/services/toast.service' +import { Toast, ToastLevel, ToastService } from 'src/app/services/toast.service' import { locationReload } from 'src/app/utils/navigation' import { CheckComponent } from '../../common/input/check/check.component' import { ColorComponent } from '../../common/input/color/color.component' @@ -102,6 +108,15 @@ const documentDetailFieldOptions = [ { id: DocumentDetailFieldID.Tags, label: $localize`Tags` }, ] +const sidebarItemLabels: Record = { + [HideableSidebarItemID.Dashboard]: $localize`Dashboard`, + [HideableSidebarItemID.SavedViews]: $localize`Saved Views`, + [HideableSidebarItemID.ShareLinks]: $localize`Share Links`, + [HideableSidebarItemID.Workflows]: $localize`Workflows`, + [HideableSidebarItemID.Mail]: $localize`Mail`, + [HideableSidebarItemID.Documentation]: $localize`Documentation`, +} + @Component({ selector: 'pngx-settings', templateUrl: './settings.component.html', @@ -149,6 +164,7 @@ export class SettingsComponent bulkEditApplyOnClose: new FormControl(null), documentListItemPerPage: new FormControl(null), slimSidebarEnabled: new FormControl(null), + sidebarHiddenItems: new FormControl([]), darkModeUseSystem: new FormControl(null), darkModeEnabled: new FormControl(null), darkModeInvertThumbs: new FormControl(null), @@ -169,14 +185,13 @@ export class SettingsComponent documentEditingRemoveInboxTags: new FormControl(null), documentEditingOverlayThumbnail: new FormControl(null), documentEditingAutoSuggest: new FormControl(null), + documentEditingSuggestionSource: new FormControl(null), documentDetailsHiddenFields: new FormControl([]), searchDbOnly: new FormControl(null), searchLink: new FormControl(null), - notificationsConsumerNewDocument: new FormControl(null), notificationsConsumerSuccess: new FormControl(null), notificationsConsumerFailed: new FormControl(null), - notificationsConsumerSuppressOnDashboard: new FormControl(null), savedViewsWarnOnUnsavedChange: new FormControl(null), sidebarViewsShowCount: new FormControl(null), @@ -186,6 +201,7 @@ export class SettingsComponent store: BehaviorSubject storeSub: Subscription + sidebarItemsSub: Subscription isDirty$: Observable isDirty: boolean = false unsubscribeNotifier: Subject = new Subject() @@ -201,8 +217,17 @@ export class SettingsComponent public readonly PdfZoomScale = PdfZoomScale public readonly PdfEditorEditMode = PdfEditorEditMode + public readonly SuggestionSource = SuggestionSource + + get aiEnabled(): boolean { + return this.settings.get(SETTINGS_KEYS.AI_ENABLED) + } public readonly documentDetailFieldOptions = documentDetailFieldOptions + public readonly sidebarItemOptions = HIDEABLE_SIDEBAR_ITEM_IDS.map((id) => ({ + id, + label: sidebarItemLabels[id], + })) get systemStatusHasErrors(): boolean { const status = this.systemStatus() @@ -230,6 +255,10 @@ export class SettingsComponent constructor() { super() + this.sidebarItemsSub = + this.settings.sidebarHiddenItemsEditingChanged.subscribe((hiddenItems) => + this.settingsForm.controls.sidebarHiddenItems.setValue(hiddenItems) + ) this.settings.settingsSaved.subscribe(() => { if (!this.savePending) this.initialize() this.savedViewsService.maybeRefreshDocumentCounts() @@ -279,14 +308,21 @@ export class SettingsComponent this.activatedRoute.paramMap.subscribe((paramMap) => { const section = paramMap.get('section') + let navID = SettingsNavIDs.General if (section) { const navIDKey: string = Object.keys(SettingsNavIDs).find( (navID) => navID.toLowerCase() == section ) if (navIDKey) { - this.activeNavID.set(SettingsNavIDs[navIDKey]) + navID = SettingsNavIDs[navIDKey] } } + this.activeNavID.set(navID) + this.settings.sidebarHiddenItemsEditing.set( + navID === SettingsNavIDs.General + ? [...this.settingsForm.controls.sidebarHiddenItems.value] + : null + ) }) } @@ -310,6 +346,7 @@ export class SettingsComponent SETTINGS_KEYS.DOCUMENT_LIST_SIZE ), slimSidebarEnabled: this.settings.get(SETTINGS_KEYS.SLIM_SIDEBAR), + sidebarHiddenItems: this.settings.get(SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS), darkModeUseSystem: this.settings.get(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM), darkModeEnabled: this.settings.get(SETTINGS_KEYS.DARK_MODE_ENABLED), darkModeInvertThumbs: this.settings.get( @@ -332,18 +369,12 @@ export class SettingsComponent updateCheckingEnabled: this.settings.get( SETTINGS_KEYS.UPDATE_CHECKING_ENABLED ), - notificationsConsumerNewDocument: this.settings.get( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_NEW_DOCUMENT - ), notificationsConsumerSuccess: this.settings.get( SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS ), notificationsConsumerFailed: this.settings.get( SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_FAILED ), - notificationsConsumerSuppressOnDashboard: this.settings.get( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD - ), savedViewsWarnOnUnsavedChange: this.settings.get( SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE ), @@ -372,6 +403,9 @@ export class SettingsComponent documentEditingAutoSuggest: this.settings.get( SETTINGS_KEYS.DOCUMENT_EDITING_AUTO_SUGGEST ), + documentEditingSuggestionSource: this.settings.get( + SETTINGS_KEYS.DOCUMENT_EDITING_SUGGESTION_SOURCE + ), documentDetailsHiddenFields: this.settings.get( SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS ), @@ -436,6 +470,12 @@ export class SettingsComponent this.settingsForm.patchValue(currentFormValue) } + if (this.settings.organizingSidebarItems()) { + this.settings.sidebarHiddenItemsEditing.set([ + ...this.settingsForm.controls.sidebarHiddenItems.value, + ]) + } + if (this.canViewSystemStatus) { this.systemStatusService.get().subscribe((status) => { this.systemStatus.set(status) @@ -444,8 +484,18 @@ export class SettingsComponent } ngOnDestroy() { + this.settings.sidebarHiddenItemsEditing.set(null) if (this.isDirty) this.settings.updateAppearanceSettings() // in case user changed appearance but didn't save this.storeSub && this.storeSub.unsubscribe() + this.sidebarItemsSub.unsubscribe() + } + + isSidebarItemShown(item: HideableSidebarItemID): boolean { + return !(this.settingsForm.value.sidebarHiddenItems || []).includes(item) + } + + toggleSidebarItem(item: HideableSidebarItemID, checked: boolean): void { + this.settings.updateSidebarItemVisibility(item, checked) } public saveSettings() { @@ -473,6 +523,10 @@ export class SettingsComponent SETTINGS_KEYS.SLIM_SIDEBAR, this.settingsForm.value.slimSidebarEnabled ) + this.settings.set( + SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, + this.settingsForm.value.sidebarHiddenItems + ) this.settings.set( SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, this.settingsForm.value.darkModeUseSystem @@ -509,10 +563,6 @@ export class SettingsComponent SETTINGS_KEYS.DATE_FORMAT, this.settingsForm.value.dateFormat ) - this.settings.set( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_NEW_DOCUMENT, - this.settingsForm.value.notificationsConsumerNewDocument - ) this.settings.set( SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS, this.settingsForm.value.notificationsConsumerSuccess @@ -521,10 +571,6 @@ export class SettingsComponent SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_FAILED, this.settingsForm.value.notificationsConsumerFailed ) - this.settings.set( - SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD, - this.settingsForm.value.notificationsConsumerSuppressOnDashboard - ) this.settings.set( SETTINGS_KEYS.NOTES_ENABLED, this.settingsForm.value.notesEnabled @@ -573,6 +619,10 @@ export class SettingsComponent SETTINGS_KEYS.DOCUMENT_EDITING_AUTO_SUGGEST, this.settingsForm.value.documentEditingAutoSuggest ) + this.settings.set( + SETTINGS_KEYS.DOCUMENT_EDITING_SUGGESTION_SOURCE, + this.settingsForm.value.documentEditingSuggestionSource + ) this.settings.set( SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS, this.settingsForm.value.documentDetailsHiddenFields @@ -598,8 +648,11 @@ export class SettingsComponent let savedToast: Toast = { content: $localize`Settings were saved successfully.`, delay: 5000, + level: ToastLevel.Success, + persistent: false, } if (reloadRequired) { + savedToast.persistent = true savedToast.content = $localize`Settings were saved successfully. Reload is required to apply some changes.` savedToast.actionName = $localize`Reload now` savedToast.action = () => { @@ -632,6 +685,11 @@ export class SettingsComponent reset() { this.settingsForm.patchValue(this.store.getValue()) + if (this.settings.organizingSidebarItems()) { + this.settings.sidebarHiddenItemsEditing.set([ + ...this.settingsForm.controls.sidebarHiddenItems.value, + ]) + } } clearThemeColor() { diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.html b/src-ui/src/app/components/admin/tasks/tasks.component.html index a55fa0f7c..1e8996398 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.html +++ b/src-ui/src/app/components/admin/tasks/tasks.component.html @@ -102,25 +102,34 @@ } - - + @if (selectedSection !== TaskSection.All && totalTasks() > pageSize) { + + + }
-
-
-
{{ sectionLabel(section) }}
-
- {tasks.length, plural, =1 {1 task} other {{{tasks.length}} tasks}} -
+
+
{{ sectionLabel(section) }}
+ @let count = sectionCount(section); + @let hasMore = selectedSection === TaskSection.All && count > tasks.length; +
+ @if (hasMore) { + {{tasks.length}} of {{count}} tasks + + } @else { + {count, plural, =1 {1 task} other {{{count}} tasks}} + }
@@ -169,10 +178,9 @@
{{ taskDisplayName(task) }}
@if (taskShowsSeparateTypeLabel(task)) { - {{ task.task_type_display }} - • + {{ task.task_type_display }} } - {{ task.trigger_source_display }} + {{ task.trigger_source_display }}
{{ task.date_created | customDate:'short' }} diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.scss b/src-ui/src/app/components/admin/tasks/tasks.component.scss index d5580c56b..a4a6e04ba 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.scss +++ b/src-ui/src/app/components/admin/tasks/tasks.component.scss @@ -72,3 +72,7 @@ pre { tbody tr:nth-last-child(2) td { border-bottom: none !important; } + +.section-header .show-all { + font-size: inherit; +} diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts index f49083623..376cd23ce 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts @@ -223,16 +223,6 @@ describe('TasksComponent', () => { ) .flush(paginatedTasks) - httpTestingController - .expectOne( - (req) => - req.url === `${environment.apiBaseUrl}tasks/` && - req.params.get('acknowledged') === 'false' && - req.params.get('page_size') === '25' && - req.params.get('page') === '1' - ) - .flush(paginatedTasks) - httpTestingController .expectOne( (req) => @@ -241,8 +231,30 @@ describe('TasksComponent', () => { !req.params.has('status') ) .flush(sectionCountResponse) + + flushTaskLists(10) }) + // answers task list requests with the fixture tasks matching their status filter + function flushTaskLists(pageSize: number, count?: number) { + httpTestingController + .match( + (req) => + req.url === `${environment.apiBaseUrl}tasks/` && + req.params.get('page_size') === `${pageSize}` + ) + .forEach((req) => { + const statuses = req.request.params.getAll('status') + const results = tasks.filter((task) => statuses.includes(task.status)) + req.flush({ count: count ?? results.length, results }) + }) + } + + function selectSection(section: TaskSection, count: number) { + component.setSection(section) + flushTaskLists(25, count) + } + it('should display task sections with counts', () => { expect(component.selectedSection).toBe(TaskSection.All) expect(component.selectedTaskType).toBeNull() @@ -338,6 +350,7 @@ describe('TasksComponent', () => { }) it('should render pagination controls next to the task filter', () => { + selectSection(TaskSection.Completed, 30) fixture.detectChanges() const controls = fixture.debugElement.query(By.css('.task-controls')) @@ -348,6 +361,51 @@ describe('TasksComponent', () => { expect(pagination).not.toBeNull() }) + it('should only paginate a section with more than one page of tasks', () => { + const pagination = () => + fixture.debugElement.query(By.css('ngb-pagination')) + + fixture.detectChanges() + expect(pagination()).toBeNull() + + selectSection(TaskSection.Completed, 2) + fixture.detectChanges() + expect(pagination()).toBeNull() + }) + + it('should load the all tasks overview one section at a time', () => { + expect(component.tasksForSection(TaskSection.NeedsAttention)).toHaveLength( + 2 + ) + expect(component.tasksForSection(TaskSection.InProgress)).toHaveLength(3) + expect(component.tasksForSection(TaskSection.Completed)).toHaveLength(2) + expect(component.totalTasks()).toBe(7) + }) + + it('should show section totals and link truncated sections to their full list', () => { + component.sectionCounts.update((counts) => ({ + ...counts, + [TaskSection.Completed]: 27, + })) + fixture.detectChanges() + + const header = (label: string) => + fixture.debugElement + .queryAll(By.css('.section-header')) + .find((h) => h.nativeElement.textContent.includes(label)) + + expect(header('Needs attention').nativeElement.textContent).toContain( + '2 tasks' + ) + expect(header('Needs attention').query(By.css('button'))).toBeNull() + + expect(header('Recently completed').nativeElement.textContent).toContain( + '2 of 27 tasks' + ) + header('Recently completed').query(By.css('button')).nativeElement.click() + expect(component.selectedSection).toBe(TaskSection.Completed) + }) + it('should apply the selected section to the server-side task query', () => { component.setSection(TaskSection.NeedsAttention) @@ -368,55 +426,56 @@ describe('TasksComponent', () => { it('should apply task type and trigger source filters to the server-side task query', () => { component.setTaskType(PaperlessTaskType.SanityCheck) - httpTestingController - .expectOne( + expect( + httpTestingController.match( (request) => request.url === `${environment.apiBaseUrl}tasks/` && - request.params.get('page_size') === '25' && + request.params.get('page_size') === '10' && request.params.get('task_type') === PaperlessTaskType.SanityCheck ) - .flush({ count: 1, results: [tasks[6]] }) + ).toHaveLength(3) component.setTriggerSource(PaperlessTaskTriggerSource.System) - httpTestingController - .expectOne( + expect( + httpTestingController.match( (request) => request.url === `${environment.apiBaseUrl}tasks/` && - request.params.get('page_size') === '25' && + request.params.get('page_size') === '10' && request.params.get('task_type') === PaperlessTaskType.SanityCheck && request.params.get('trigger_source') === PaperlessTaskTriggerSource.System ) - .flush({ count: 1, results: [tasks[6]] }) + ).toHaveLength(3) }) it('should apply text filters to the server-side task query', () => { component.filterText = 'invoice' jest.advanceTimersByTime(150) - httpTestingController - .expectOne( + expect( + httpTestingController.match( (request) => request.url === `${environment.apiBaseUrl}tasks/` && - request.params.get('page_size') === '25' && + request.params.get('page_size') === '10' && request.params.get('name') === 'invoice' ) - .flush({ count: 1, results: [tasks[0]] }) + ).toHaveLength(3) component.setFilterTarget(TaskFilterTargetID.Result) - httpTestingController - .expectOne( + expect( + httpTestingController.match( (request) => request.url === `${environment.apiBaseUrl}tasks/` && - request.params.get('page_size') === '25' && + request.params.get('page_size') === '10' && request.params.get('result') === 'invoice' ) - .flush({ count: 0, results: [] }) + ).toHaveLength(3) }) it('should load a different task page when pagination changes', () => { + selectSection(TaskSection.Completed, 30) component.setPage(2) const pageTwoTasks = { @@ -440,6 +499,7 @@ describe('TasksComponent', () => { }) it('should not replace section counts with current-page counts', () => { + selectSection(TaskSection.Completed, 30) component.setPage(2) httpTestingController @@ -455,11 +515,21 @@ describe('TasksComponent', () => { results: [tasks[0]], }) + expect(component.sectionCount(TaskSection.All)).toBe(7) expect(component.sectionCount(TaskSection.NeedsAttention)).toBe(2) expect(component.sectionCount(TaskSection.InProgress)).toBe(3) expect(component.sectionCount(TaskSection.Completed)).toBe(2) }) + it('should stop loading when the overview fails to load', () => { + component.setSection(TaskSection.All) + httpTestingController + .match((req) => req.params.get('page_size') === '10')[0] + .flush('', { status: 500, statusText: 'Error' }) + + expect(component.loading()).toBe(false) + }) + it('should expose stable task type options and disable empty ones', () => { expect(component.taskTypeOptions.map((option) => option.value)).toContain( PaperlessTaskType.TrainClassifier diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.ts b/src-ui/src/app/components/admin/tasks/tasks.component.ts index f634a87f7..b548703df 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.ts @@ -15,6 +15,9 @@ import { distinctUntilChanged, filter, first, + forkJoin, + map, + Observable, Subject, takeUntil, timer, @@ -25,6 +28,7 @@ import { PaperlessTaskTriggerSource, PaperlessTaskType, } from 'src/app/data/paperless-task' +import { Results } from 'src/app/data/results' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { TasksService } from 'src/app/services/tasks.service' @@ -99,6 +103,10 @@ const TASK_TYPE_OPTIONS: Array<{ value: PaperlessTaskType.BulkDelete, label: $localize`Bulk Delete`, }, + { + value: PaperlessTaskType.ApplyAiSuggestions, + label: $localize`Apply AI Suggestions`, + }, ] const TRIGGER_SOURCE_OPTIONS: Array<{ @@ -165,6 +173,7 @@ export class TasksComponent public expandedTask: number public autoRefreshEnabled: boolean = true public readonly pageSize = 25 + public readonly overviewSize = 10 public page: number = 1 readonly totalTasks = signal(0) readonly sectionCounts = signal>({ @@ -480,13 +489,6 @@ export class TasksComponent return this.sectionCounts()[section] } - private setSectionCount(section: TaskSection, count: number) { - this.sectionCounts.update((counts) => ({ - ...counts, - [section]: count, - })) - } - sectionShowsResults(section: TaskSection): boolean { return section !== TaskSection.InProgress } @@ -733,21 +735,12 @@ export class TasksComponent this.reloadSectionCounts() this.loading.set(true) - this.tasksService - .list( - this.page, - this.pageSize, - this.getParamsForSection(this.selectedSection) - ) + this.listTasks() .pipe(first(), takeUntil(this.unsubscribeNotifier)) .subscribe({ next: (result) => { this.pagedTasks.set(result.results) this.totalTasks.set(result.count) - this.setSectionCount(TaskSection.All, result.count) - if (this.selectedSection !== TaskSection.All) { - this.setSectionCount(this.selectedSection, result.count) - } this.loading.set(false) if ( this.page > 1 && @@ -763,4 +756,30 @@ export class TasksComponent }, }) } + + private listTasks(): Observable> { + if (this.selectedSection !== TaskSection.All) { + return this.tasksService.list( + this.page, + this.pageSize, + this.getParamsForSection(this.selectedSection) + ) + } + + // All is an overview of each section to avoid splitting sections across pages + return forkJoin( + this.sections.map((section) => + this.tasksService.list( + 1, + this.overviewSize, + this.getParamsForSection(section) + ) + ) + ).pipe( + map((results) => ({ + count: results.reduce((sum, result) => sum + result.count, 0), + results: results.flatMap((result) => result.results), + })) + ) + } } diff --git a/src-ui/src/app/components/admin/trash/trash.component.spec.ts b/src-ui/src/app/components/admin/trash/trash.component.spec.ts index 7edb7121e..4ad48dd43 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.spec.ts +++ b/src-ui/src/app/components/admin/trash/trash.component.spec.ts @@ -99,11 +99,16 @@ describe('TrashComponent', () => { modal.componentInstance.confirmClicked.next() expect(toastErrorSpy).toHaveBeenCalled() + let toasts + toastService.getToasts().subscribe((allToasts) => { + toasts = [...allToasts] + }) trashSpy.mockReturnValue(of('OK')) component.delete(documentsInTrash[0]) expect(modal).toBeDefined() modal.componentInstance.confirmClicked.next() expect(trashSpy).toHaveBeenCalled() + expect(toasts[0].content).toContain('deleted') }) it('should support empty trash, show error if needed', () => { diff --git a/src-ui/src/app/components/admin/trash/trash.component.ts b/src-ui/src/app/components/admin/trash/trash.component.ts index 2f8fbe841..800a7c084 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.ts +++ b/src-ui/src/app/components/admin/trash/trash.component.ts @@ -11,7 +11,7 @@ import { takeUntil, tap } from 'rxjs' import { Document } from 'src/app/data/document' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SettingsService } from 'src/app/services/settings.service' -import { ToastService } from 'src/app/services/toast.service' +import { ToastLevel, ToastService } from 'src/app/services/toast.service' import { TrashService } from 'src/app/services/trash.service' import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' import { PageHeaderComponent } from '../../common/page-header/page-header.component' @@ -87,9 +87,11 @@ export class TrashComponent modal.componentInstance.buttonsEnabled.set(false) this.trashService.emptyTrash([document.id]).subscribe({ next: () => { - this.toastService.showInfo( - $localize`Document "${document.title}" deleted` - ) + this.toastService.show({ + content: $localize`Document "${document.title}" deleted`, + delay: 5000, + level: ToastLevel.Success, + }) modal.close() this.reload() }, @@ -122,7 +124,11 @@ export class TrashComponent .emptyTrash(documents ? Array.from(documents) : null) .subscribe({ next: () => { - this.toastService.showInfo($localize`Document(s) deleted`) + this.toastService.show({ + content: $localize`Document(s) deleted`, + delay: 5000, + level: ToastLevel.Success, + }) this.allToggled.set(false) modal.close() this.reload() @@ -144,6 +150,7 @@ export class TrashComponent this.toastService.show({ content: $localize`Document "${document.title}" restored`, delay: 5000, + level: ToastLevel.Success, actionName: $localize`Open document`, action: () => { this.router.navigate(['documents', document.id]) @@ -165,7 +172,11 @@ export class TrashComponent .restoreDocuments(documents ? Array.from(documents) : null) .subscribe({ next: () => { - this.toastService.showInfo($localize`Document(s) restored`) + this.toastService.show({ + content: $localize`Document(s) restored`, + delay: 5000, + level: ToastLevel.Success, + }) this.allToggled.set(false) this.reload() }, diff --git a/src-ui/src/app/components/admin/users-groups/users-groups.component.spec.ts b/src-ui/src/app/components/admin/users-groups/users-groups.component.spec.ts index a06852994..8e2551f15 100644 --- a/src-ui/src/app/components/admin/users-groups/users-groups.component.spec.ts +++ b/src-ui/src/app/components/admin/users-groups/users-groups.component.spec.ts @@ -101,7 +101,7 @@ describe('UsersAndGroupsComponent', () => { component.editUser(users[0]) const editDialog = modal.componentInstance as UserEditDialogComponent const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') editDialog.failed.emit() expect(toastErrorSpy).toHaveBeenCalled() settingsService.currentUser.set(users[1]) // simulate logged in as different user @@ -120,7 +120,7 @@ describe('UsersAndGroupsComponent', () => { const deleteDialog = modal.componentInstance as ConfirmDialogComponent const deleteSpy = jest.spyOn(userService, 'delete') const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') const listAllSpy = jest.spyOn(userService, 'listAll') deleteSpy.mockReturnValueOnce( throwError(() => new Error('error deleting user')) @@ -154,6 +154,31 @@ describe('UsersAndGroupsComponent', () => { jest.useRealTimers() }) + it('should logout current user under base href if password changed', () => { + jest.useFakeTimers() + const base = document.createElement('base') + base.href = '/paperless/' + document.head.appendChild(base) + completeSetup() + let modal: NgbModalRef + modalService.activeInstances.subscribe((refs) => (modal = refs[0])) + component.editUser(users[0]) + const navSpy = jest + .spyOn(navUtils, 'setLocationHref') + .mockImplementation(() => {}) + const editDialog = modal.componentInstance as UserEditDialogComponent + editDialog.passwordIsSet = true + settingsService.currentUser.set(users[0]) // simulate logged in as same user + editDialog.succeeded.emit(users[0]) + fixture.detectChanges() + jest.advanceTimersByTime(2600) + expect(navSpy).toHaveBeenCalledWith( + `${window.location.origin}/paperless/accounts/logout/?next=/paperless/accounts/login/?next=/paperless/` + ) + base.remove() + jest.useRealTimers() + }) + it('should support edit / create group, show error if needed', () => { completeSetup() let modal: NgbModalRef @@ -161,7 +186,7 @@ describe('UsersAndGroupsComponent', () => { component.editGroup(groups[0]) const editDialog = modal.componentInstance as GroupEditDialogComponent const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') editDialog.failed.emit() expect(toastErrorSpy).toHaveBeenCalled() editDialog.succeeded.emit(groups[0]) @@ -179,7 +204,7 @@ describe('UsersAndGroupsComponent', () => { const deleteDialog = modal.componentInstance as ConfirmDialogComponent const deleteSpy = jest.spyOn(groupService, 'delete') const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') const listAllSpy = jest.spyOn(groupService, 'listAll') deleteSpy.mockReturnValueOnce( throwError(() => new Error('error deleting group')) diff --git a/src-ui/src/app/components/admin/users-groups/users-groups.component.ts b/src-ui/src/app/components/admin/users-groups/users-groups.component.ts index b7eea7ff0..406e17398 100644 --- a/src-ui/src/app/components/admin/users-groups/users-groups.component.ts +++ b/src-ui/src/app/components/admin/users-groups/users-groups.component.ts @@ -116,12 +116,13 @@ export class UsersAndGroupsComponent $localize`Password has been changed, you will be logged out momentarily.` ) setTimeout(() => { + const basePath = new URL(document.baseURI).pathname setLocationHref( - `${window.location.origin}/accounts/logout/?next=/accounts/login/?next=/` + `${window.location.origin}${basePath}accounts/logout/?next=${basePath}accounts/login/?next=${basePath}` ) }, 2500) } else { - this.toastService.showInfo( + this.toastService.showSuccess( $localize`Saved user "${newUser.username}".` ) this.usersService.listAll().subscribe((r) => { @@ -150,7 +151,9 @@ export class UsersAndGroupsComponent this.usersService.delete(user).subscribe({ next: () => { modal.close() - this.toastService.showInfo($localize`Deleted user "${user.username}"`) + this.toastService.showSuccess( + $localize`Deleted user "${user.username}"` + ) this.usersService.listAll().subscribe((r) => { this.users.set(r.results) }) @@ -177,7 +180,9 @@ export class UsersAndGroupsComponent modal.componentInstance.succeeded .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe((newGroup) => { - this.toastService.showInfo($localize`Saved group "${newGroup.name}".`) + this.toastService.showSuccess( + $localize`Saved group "${newGroup.name}".` + ) this.groupsService.listAll().subscribe((r) => { this.groups.set(r.results) }) @@ -203,7 +208,9 @@ export class UsersAndGroupsComponent this.groupsService.delete(group).subscribe({ next: () => { modal.close() - this.toastService.showInfo($localize`Deleted group "${group.name}"`) + this.toastService.showSuccess( + $localize`Deleted group "${group.name}"` + ) this.groupsService.listAll().subscribe((r) => { this.groups.set(r.results) }) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index 244b8436b..feae4da39 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -29,8 +29,20 @@
-
    @@ -70,6 +82,9 @@
+ + +
diff --git a/src-ui/src/app/components/app-frame/app-frame.component.scss b/src-ui/src/app/components/app-frame/app-frame.component.scss index 44bebd82e..933dd9374 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.scss +++ b/src-ui/src/app/components/app-frame/app-frame.component.scss @@ -66,6 +66,7 @@ } .search-container { + min-width: 0; padding-left: 1rem; padding-right: 1rem; } @@ -499,6 +500,11 @@ main { // true center the search with equal flex widths @media (min-width: 768px) { + .search-container { + // Prevent input padding and the conditional search button from resizing + flex-basis: 55rem; + } + .navbar-brand-container, .navbar > ul { display: flex; // so the brand link stays as wide as its contents @@ -532,7 +538,36 @@ main { .header-search { width: 100%; - max-width: 55rem; + max-width: 50rem; +} + +.header-search pngx-global-search { + min-width: 0; +} + +// light w shadow to stand out against search +.header-upload { + --bs-btn-bg: rgba(255, 255, 255, .15); + --bs-btn-hover-bg: rgba(255, 255, 255, .22); + --bs-btn-active-bg: rgba(255, 255, 255, .3); + color: var(--pngx-primary-text-contrast) !important; // .navbar .dropdown > .btn in styles.scss + + & + & { + border-left: 1px solid rgba(255, 255, 255, .2) !important; + } + + &:focus { + box-shadow: none; + } + + &:focus-visible { + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .5); + } +} + +.header-upload-group { + border-radius: var(--bs-border-radius-sm); + box-shadow: 0 1px 3px rgba(0, 0, 0, .35), 0 1px 1px rgba(0, 0, 0, .2); } @media screen and (max-width: 575.98px) { @@ -624,8 +659,7 @@ main { } .dropdown-toggle::after { - margin-left: 0.4em; - vertical-align: 0.155em; + display: none; } .navbar .dropdown-menu { @@ -662,3 +696,7 @@ main { ::ng-deep .navItemDrag .position-absolute i-bs { display: none; } + +.smaller { + font-size: 0.75rem; +} diff --git a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts index d9b1acda4..971a4ceeb 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts @@ -6,7 +6,7 @@ import { } from '@angular/common/http/testing' import { ComponentFixture, TestBed } from '@angular/core/testing' import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { BrowserModule } from '@angular/platform-browser' +import { BrowserModule, By } from '@angular/platform-browser' import { ActivatedRoute, Router } from '@angular/router' import { RouterTestingModule } from '@angular/router/testing' import { NgbModal, NgbModalModule, NgbModule } from '@ng-bootstrap/ng-bootstrap' @@ -15,7 +15,7 @@ import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { of, throwError } from 'rxjs' import { routes } from 'src/app/app-routing.module' import { SavedView } from 'src/app/data/saved-view' -import { SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { HideableSidebarItemID, SETTINGS_KEYS } from 'src/app/data/ui-settings' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { @@ -33,8 +33,11 @@ import { SearchService } from 'src/app/services/rest/search.service' import { SettingsService } from 'src/app/services/settings.service' import { TasksService } from 'src/app/services/tasks.service' import { ToastService } from 'src/app/services/toast.service' +import { UploadDocumentsService } from 'src/app/services/upload-documents.service' +import { WebsocketStatusService } from 'src/app/services/websocket-status.service' import { environment } from 'src/environments/environment' import { ProfileEditDialogComponent } from '../common/profile-edit-dialog/profile-edit-dialog.component' +import { UploadStatusTrayComponent } from '../common/upload-status-tray/upload-status-tray.component' import { DocumentDetailComponent } from '../document-detail/document-detail.component' import { AppFrameComponent } from './app-frame.component' import { GlobalSearchComponent } from './global-search/global-search.component' @@ -287,6 +290,87 @@ describe('AppFrameComponent', () => { jest.useRealTimers() }) + it('should hide configured sidebar items', () => { + settingsService.set(SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, [ + HideableSidebarItemID.Dashboard, + HideableSidebarItemID.Workflows, + HideableSidebarItemID.ShareLinks, + ]) + fixture.detectChanges() + + expect( + fixture.nativeElement.querySelector('[routerLink="dashboard"]') + .parentElement.classList + ).toContain('d-none') + expect( + fixture.nativeElement.querySelector('[routerLink="workflows"]') + .parentElement.classList + ).toContain('d-none') + expect( + fixture.nativeElement.querySelector('[routerLink="share-links"]') + .parentElement.classList + ).toContain('d-none') + expect( + fixture.nativeElement.querySelector('[routerLink="mail"]').parentElement + .classList + ).not.toContain('d-none') + }) + + it('should show hidden items and visibility switches while customizing', () => { + settingsService.set(SETTINGS_KEYS.SIDEBAR_HIDDEN_ITEMS, [ + HideableSidebarItemID.Dashboard, + ]) + settingsService.sidebarHiddenItemsEditing.set([ + HideableSidebarItemID.Dashboard, + ]) + fixture.detectChanges() + + expect( + fixture.nativeElement.querySelectorAll('pngx-input-switch').length + ).toBe(6) + expect( + fixture.nativeElement.querySelector('[routerLink="dashboard"]') + .parentElement.classList + ).not.toContain('d-none') + expect( + fixture.nativeElement.querySelector('[routerLink="dashboard"]').classList + ).toContain('opacity-50') + + settingsService.set(SETTINGS_KEYS.SLIM_SIDEBAR, true) + fixture.detectChanges() + + expect( + Array.from( + fixture.nativeElement.querySelectorAll('pngx-input-switch') + ).every((toggle: HTMLElement) => toggle.classList.contains('d-none')) + ).toBe(true) + expect( + fixture.nativeElement.querySelector('[routerLink="dashboard"]').classList + ).not.toContain('pe-5') + + settingsService.set(SETTINGS_KEYS.SLIM_SIDEBAR, false) + component.slimSidebarAnimating.set(true) + fixture.detectChanges() + + expect( + Array.from( + fixture.nativeElement.querySelectorAll('pngx-input-switch') + ).every((toggle: HTMLElement) => toggle.classList.contains('d-none')) + ).toBe(true) + + component.slimSidebarAnimating.set(false) + fixture.detectChanges() + + expect( + Array.from( + fixture.nativeElement.querySelectorAll('pngx-input-switch') + ).every((toggle: HTMLElement) => !toggle.classList.contains('d-none')) + ).toBe(true) + expect( + fixture.nativeElement.querySelector('[routerLink="dashboard"]').classList + ).toContain('pe-5') + }) + it('should show error on toggle slim sidebar if store settings fails', () => { jest.spyOn(console, 'warn').mockImplementation(() => {}) const toastSpy = jest.spyOn(toastService, 'showError') @@ -381,6 +465,45 @@ describe('AppFrameComponent', () => { expect(routerSpy).toHaveBeenCalled() }) + it('should upload files selected from the navbar upload button', () => { + const uploadDocumentsService = TestBed.inject(UploadDocumentsService) + const uploadSpy = jest + .spyOn(uploadDocumentsService, 'uploadFiles') + .mockImplementation(() => {}) + const toastSpy = jest.spyOn(toastService, 'showInfo') + const file = new File(['testing'], 'file.pdf') + const input = window.document.createElement('input') + jest.spyOn(input, 'files', 'get').mockReturnValue([file] as any) + + component.onFileSelected({ target: input } as unknown as Event) + expect(toastSpy).not.toHaveBeenCalled() + expect(uploadSpy).toHaveBeenCalledWith([file]) + }) + + it('should show in-progress uploads and expand the status tray', () => { + const websocketStatusService = TestBed.inject(WebsocketStatusService) + expect(component.uploadsInProgress).toEqual(0) + websocketStatusService.newFileUpload('file.pdf') + expect(component.uploadsInProgress).toEqual(1) + + fixture.detectChanges() + const tray = fixture.debugElement.query( + By.directive(UploadStatusTrayComponent) + ).componentInstance as UploadStatusTrayComponent + tray.toggleCollapsed() + expect(tray.collapsed()).toBe(true) + component.showUploadStatus() + expect(tray.collapsed()).toBe(false) + }) + + it('should not upload when no files are selected from the navbar', () => { + const uploadDocumentsService = TestBed.inject(UploadDocumentsService) + const uploadSpy = jest.spyOn(uploadDocumentsService, 'uploadFiles') + const input = window.document.createElement('input') + component.onFileSelected({ target: input } as unknown as Event) + expect(uploadSpy).not.toHaveBeenCalled() + }) + it('should close all documents on logout', () => { const closeAllSpy = jest.spyOn(openDocumentsService, 'closeAll') component.onLogout() @@ -402,7 +525,7 @@ describe('AppFrameComponent', () => { it('should update saved view sorting on drag + drop, show info', () => { const settingsSpy = jest.spyOn(settingsService, 'updateSidebarViewsSort') - const toastSpy = jest.spyOn(toastService, 'showInfo') + const toastSpy = jest.spyOn(toastService, 'showSuccess') jest.spyOn(settingsService, 'storeSettings').mockReturnValue(of(true)) component.onDrop({ previousIndex: 0, currentIndex: 1 } as CdkDragDrop< SavedView[] @@ -444,6 +567,7 @@ describe('AppFrameComponent', () => { it('should show toasts for django messages', () => { const toastErrorSpy = jest.spyOn(toastService, 'showError') + const toastSuccessSpy = jest.spyOn(toastService, 'showSuccess') const toastInfoSpy = jest.spyOn(toastService, 'showInfo') jest.spyOn(messagesService, 'get').mockReturnValue([ { level: DjangoMessageLevel.WARNING, message: 'Test warning' }, @@ -454,7 +578,8 @@ describe('AppFrameComponent', () => { ]) component.ngOnInit() expect(toastErrorSpy).toHaveBeenCalledTimes(2) - expect(toastInfoSpy).toHaveBeenCalledTimes(3) + expect(toastSuccessSpy).toHaveBeenCalledTimes(1) + expect(toastInfoSpy).toHaveBeenCalledTimes(2) }) it('should call maybeRefreshDocumentCounts after saved views reload', () => { diff --git a/src-ui/src/app/components/app-frame/app-frame.component.ts b/src-ui/src/app/components/app-frame/app-frame.component.ts index 59a2ba18b..4f9a02f6e 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.ts @@ -6,7 +6,15 @@ import { moveItemInArray, } from '@angular/cdk/drag-drop' import { NgClass } from '@angular/common' -import { Component, HostListener, inject, OnInit, signal } from '@angular/core' +import { + Component, + HostListener, + inject, + OnInit, + signal, + viewChild, +} from '@angular/core' +import { FormsModule } from '@angular/forms' import { ActivatedRoute, Router, RouterModule } from '@angular/router' import { NgbCollapseModule, @@ -21,7 +29,11 @@ import { Observable } from 'rxjs' import { first } from 'rxjs/operators' import { Document } from 'src/app/data/document' import { SavedView } from 'src/app/data/saved-view' -import { CollapsibleSection, SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { + CollapsibleSection, + HideableSidebarItemID, + SETTINGS_KEYS, +} from 'src/app/data/ui-settings' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { ComponentCanDeactivate } from 'src/app/guards/dirty-doc.guard' import { DocumentTitlePipe } from 'src/app/pipes/document-title.pipe' @@ -43,11 +55,15 @@ import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { SettingsService } from 'src/app/services/settings.service' import { TasksService } from 'src/app/services/tasks.service' import { ToastService } from 'src/app/services/toast.service' +import { UploadDocumentsService } from 'src/app/services/upload-documents.service' +import { WebsocketStatusService } from 'src/app/services/websocket-status.service' import { environment } from 'src/environments/environment' import { ChatComponent } from '../chat/chat/chat.component' +import { SwitchComponent } from '../common/input/switch/switch.component' import { BrandMarkComponent } from '../common/logo/brand-mark/brand-mark.component' import { LogoComponent } from '../common/logo/logo.component' import { ProfileEditDialogComponent } from '../common/profile-edit-dialog/profile-edit-dialog.component' +import { UploadStatusTrayComponent } from '../common/upload-status-tray/upload-status-tray.component' import { DocumentDetailComponent } from '../document-detail/document-detail.component' import { ComponentWithPermissions } from '../with-permissions/with-permissions.component' import { GlobalSearchComponent } from './global-search/global-search.component' @@ -76,6 +92,9 @@ const SCROLL_THRESHOLD = 16 NgxBootstrapIconsModule, DragDropModule, TourNgBootstrap, + FormsModule, + SwitchComponent, + UploadStatusTrayComponent, ], }) export class AppFrameComponent @@ -93,11 +112,16 @@ export class AppFrameComponent private modalService = inject(NgbModal) permissionsService = inject(PermissionsService) private djangoMessagesService = inject(DjangoMessagesService) + private uploadDocumentsService = inject(UploadDocumentsService) + private websocketStatusService = inject(WebsocketStatusService) + + private readonly uploadStatusTray = viewChild(UploadStatusTrayComponent) readonly appRemoteVersion = signal(null) readonly isMenuCollapsed = signal(true) readonly slimSidebarAnimating = signal(false) readonly mobileSearchHidden = signal(false) + readonly HideableSidebarItemID = HideableSidebarItemID private readonly versionSetting = this.settingsService.getSignal( SETTINGS_KEYS.VERSION ) @@ -162,6 +186,8 @@ export class AppFrameComponent this.toastService.showError(message.message) break case DjangoMessageLevel.SUCCESS: + this.toastService.showSuccess(message.message) + break case DjangoMessageLevel.INFO: case DjangoMessageLevel.DEBUG: this.toastService.showInfo(message.message) @@ -195,6 +221,10 @@ export class AppFrameComponent }, 200) // slightly longer than css animation for slim sidebar } + toggleSidebarItem(item: HideableSidebarItemID, visible: boolean): void { + this.settingsService.updateSidebarItemVisibility(item, visible) + } + toggleAttributesSections(event?: Event): void { event?.preventDefault() event?.stopPropagation() @@ -221,6 +251,19 @@ export class AppFrameComponent return this.appTitleSetting() || environment.appTitle } + get canManageShareLinks(): boolean { + return ( + this.permissionsService.currentUserCan( + PermissionAction.View, + PermissionType.ShareLink + ) || + this.permissionsService.currentUserCan( + PermissionAction.View, + PermissionType.ShareLinkBundle + ) + ) + } + get customAppTitle(): string { return this.appTitleSetting() } @@ -451,7 +494,7 @@ export class AppFrameComponent this.settingsService.updateSidebarViewsSort(sidebarViews).subscribe({ next: () => { - this.toastService.showInfo($localize`Sidebar views updated`) + this.toastService.showSuccess($localize`Sidebar views updated`) }, error: (e) => { this.toastService.showError($localize`Error updating sidebar views`, e) @@ -485,6 +528,22 @@ export class AppFrameComponent } } + onFileSelected(event: Event) { + const input = event.target as HTMLInputElement + const files = Array.from(input.files ?? []) + input.value = '' + if (!files.length) return + this.uploadDocumentsService.uploadFiles(files) + } + + get uploadsInProgress(): number { + return this.websocketStatusService.getConsumerStatusNotCompleted().length + } + + showUploadStatus() { + this.uploadStatusTray()?.expand() + } + onLogout() { this.openDocumentsService.closeAll() } diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.scss b/src-ui/src/app/components/app-frame/global-search/global-search.component.scss index 274eed472..0576a81db 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.scss +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.scss @@ -70,6 +70,17 @@ form { max-height: 75vh; } +.dropdown.show { + // Hide the search icon when the dropdown is shown + i-bs[name="search"] { + display: none !important; + } + + .form-control { + padding-left: 0.5rem; + } +} + .dropdown-item { &:has(button:focus) { background-color: var(--pngx-bg-darker); diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts index 9d0655ca4..015984b40 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts @@ -409,7 +409,7 @@ describe('GlobalSearchComponent', () => { const editDialog = modal.componentInstance as CustomFieldEditDialogComponent const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') // fail first editDialog.failed.emit({ error: 'error creating item' }) @@ -460,7 +460,7 @@ describe('GlobalSearchComponent', () => { const editDialog = modal.componentInstance as CustomFieldEditDialogComponent const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') // fail first editDialog.failed.emit({ error: 'error creating item' }) diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts index 9a70189a6..80f9ce8c2 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts @@ -216,7 +216,7 @@ export class GlobalSearchComponent implements OnInit { modalRef.componentInstance.dialogMode.set(EditDialogMode.EDIT) modalRef.componentInstance.object = object modalRef.componentInstance.succeeded.subscribe(() => { - this.toastService.showInfo($localize`Successfully updated object.`) + this.toastService.showSuccess($localize`Successfully updated object.`) }) modalRef.componentInstance.failed.subscribe((e) => { this.toastService.showError($localize`Error occurred saving object.`, e) @@ -254,7 +254,7 @@ export class GlobalSearchComponent implements OnInit { modalRef.componentInstance.dialogMode.set(EditDialogMode.EDIT) modalRef.componentInstance.object = object modalRef.componentInstance.succeeded.subscribe(() => { - this.toastService.showInfo($localize`Successfully updated object.`) + this.toastService.showSuccess($localize`Successfully updated object.`) }) modalRef.componentInstance.failed.subscribe((e) => { this.toastService.showError($localize`Error occurred saving object.`, e) diff --git a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html index 1840d6453..53b28e15d 100644 --- a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html +++ b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html @@ -1,28 +1,31 @@ diff --git a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.scss b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.scss index 71bd9a6ff..132d3f21b 100644 --- a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.scss +++ b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.scss @@ -30,3 +30,7 @@ right: -3rem; } } + +.clear-all:hover { + color: var(--bs-body-color) !important; +} diff --git a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.spec.ts b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.spec.ts index 42a891642..bad2fdb6b 100644 --- a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.spec.ts +++ b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.spec.ts @@ -3,7 +3,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing' import { ComponentFixture, TestBed } from '@angular/core/testing' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { Subject } from 'rxjs' -import { Toast, ToastService } from 'src/app/services/toast.service' +import { Toast, ToastLevel, ToastService } from 'src/app/services/toast.service' import { ToastsDropdownComponent } from './toasts-dropdown.component' const toasts = [ @@ -90,4 +90,73 @@ describe('ToastsDropdownComponent', () => { component.onOpenChange(true) expect(spy).toHaveBeenCalledWith(true) }) + + it('should badge unread toasts, red when one is an error', () => { + toastsSubject.next([ + { id: 'a', content: 'Read', delay: 5000, read: true }, + { id: 'b', content: 'Unread', delay: 5000, read: false }, + ]) + fixture.detectChanges() + let badge: HTMLElement = fixture.nativeElement.querySelector( + '.notification-count' + ) + expect(badge.textContent.trim()).toEqual('1') + expect(badge.classList).toContain('bg-secondary') + + toastsSubject.next([ + { id: 'c', content: 'Failed', delay: 5000, level: ToastLevel.Error }, + ]) + fixture.detectChanges() + badge = fixture.nativeElement.querySelector('.notification-count') + expect(badge.classList).toContain('bg-danger') + + toastsSubject.next([{ id: 'd', content: 'Seen', delay: 5000, read: true }]) + fixture.detectChanges() + expect( + fixture.nativeElement.querySelector('.notification-count') + ).toBeNull() + }) + + it('should mark all toasts read when opened', () => { + const markSpy = jest.spyOn(toastService, 'markAllRead') + component.onOpenChange(false) + expect(markSpy).not.toHaveBeenCalled() + component.onOpenChange(true) + expect(markSpy).toHaveBeenCalled() + }) + + it('should tick the clock only while open', () => { + jest.useFakeTimers() + component.onOpenChange(true) + const opened = component.now() + jest.advanceTimersByTime(30000) + const ticked = component.now() + expect(ticked).not.toBe(opened) + + component.onOpenChange(false) + jest.advanceTimersByTime(60000) + expect(component.now()).toBe(ticked) + jest.useRealTimers() + }) + + it('should mark toasts that were unread when opened as new', () => { + toastsSubject.next([ + { id: 'a', content: 'Seen', delay: 5000, read: true }, + { id: 'b', content: 'Unseen', delay: 5000, read: false }, + ]) + fixture.detectChanges() + component.onOpenChange(true) + expect([...component.newIds()]).toEqual(['b']) + component.onOpenChange(false) + expect(component.newIds().size).toEqual(0) + }) + + it('should clear the toast and close the menu when an action is used', () => { + const toast = { id: 'a', content: 'Moved', delay: 5000 } + const closeToastSpy = jest.spyOn(toastService, 'closeToast') + const closeSpy = jest.spyOn(component.dropdown, 'close') + component.onActioned(toast) + expect(closeToastSpy).toHaveBeenCalledWith(toast) + expect(closeSpy).toHaveBeenCalled() + }) }) diff --git a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.ts b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.ts index b0bcafd68..c2b758af4 100644 --- a/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.ts +++ b/src-ui/src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.ts @@ -1,12 +1,20 @@ -import { Component, inject } from '@angular/core' -import { toSignal } from '@angular/core/rxjs-interop' import { + Component, + DestroyRef, + ViewChild, + computed, + inject, + signal, +} from '@angular/core' +import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop' +import { + NgbDropdown, NgbDropdownModule, NgbProgressbarModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { map } from 'rxjs' -import { Toast, ToastService } from 'src/app/services/toast.service' +import { Subscription, interval, map } from 'rxjs' +import { Toast, ToastLevel, ToastService } from 'src/app/services/toast.service' import { ToastComponent } from '../../common/toast/toast.component' @Component({ @@ -22,13 +30,44 @@ import { ToastComponent } from '../../common/toast/toast.component' }) export class ToastsDropdownComponent { toastService = inject(ToastService) + private destroyRef = inject(DestroyRef) + private clock: Subscription + + @ViewChild(NgbDropdown) dropdown: NgbDropdown + + /** Drives the relative timestamps, ticks only while the dropdown is open */ + readonly now = signal(new Date()) + + /** Notifications that were unread when the dropdown was opened */ + readonly newIds = signal(new Set()) readonly toasts = toSignal( this.toastService.getToasts().pipe(map((toasts) => [...toasts])), { initialValue: [] as Toast[] } ) + readonly unread = computed(() => this.toasts().filter((t) => !t.read)) + + readonly hasUnreadError = computed(() => + this.unread().some((t) => t.level === ToastLevel.Error) + ) + onOpenChange(open: boolean): void { this.toastService.suppressPopupToasts = open + this.clock?.unsubscribe() + this.newIds.set(new Set(open ? this.unread().map((t) => t.id) : [])) + if (open) { + this.toastService.markAllRead() + this.now.set(new Date()) + this.clock = interval(30000) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => this.now.set(new Date())) + } + } + + /** Using an action (Undo, Open document...) clears it and closes the menu */ + onActioned(toast: Toast): void { + this.toastService.closeToast(toast) + this.dropdown?.close() } } diff --git a/src-ui/src/app/components/chat/chat/chat.component.html b/src-ui/src/app/components/chat/chat/chat.component.html index d8136fbaf..eb4f8cb01 100644 --- a/src-ui/src/app/components/chat/chat/chat.component.html +++ b/src-ui/src/app/components/chat/chat/chat.component.html @@ -1,49 +1,85 @@ - diff --git a/src-ui/src/app/components/chat/chat/chat.component.scss b/src-ui/src/app/components/chat/chat/chat.component.scss index f14be66e2..64c373734 100644 --- a/src-ui/src/app/components/chat/chat/chat.component.scss +++ b/src-ui/src/app/components/chat/chat/chat.component.scss @@ -1,17 +1,13 @@ .dropdown-menu { - width: var(--pngx-toast-max-width); + width: min(36rem, calc(100vw - 20px)); } .chat-messages { - max-height: 350px; + max-height: min(60dvh, 36rem); overflow-y: auto; white-space: pre-wrap; } -.chat-references { - font-family: var(--bs-font-sans-serif); -} - .dropdown-toggle::after { display: none; } @@ -20,23 +16,44 @@ white-space: initial; } -@media screen and (max-width: 400px) { - :host ::ng-deep .dropdown-menu-end { - right: -3rem; +@media screen and (max-width: 575.98px) { + .chat-messages { + max-height: calc(100dvh - 12rem); } } -.blinking-cursor { - font-weight: bold; - font-size: 1.2em; - animation: blink 1s step-end infinite; +.chat-markdown.streaming ::ng-deep { + > :last-child:not(ul, ol, table)::after, + > :is(ul, ol):last-child > li:last-child::after { + content: ''; + display: inline-block; + width: 2px; + height: 1.05em; + margin-left: 2px; + background-color: currentColor; + vertical-align: -0.15em; + animation: blink 1s step-end infinite; + } } @keyframes blink { - from, to { + 50% { opacity: 0; } - 50% { - opacity: 1; +} + +.chat-markdown ::ng-deep { + h1, h2, h3, h4, h5, h6 { + font-size: 1em; + font-weight: bold; + } + + th, td { + padding: 0.15rem 0.4rem; + border: 1px solid var(--bs-border-color); + } + + > :last-child { + margin-bottom: 0; } } diff --git a/src-ui/src/app/components/chat/chat/chat.component.spec.ts b/src-ui/src/app/components/chat/chat/chat.component.spec.ts index 5b8e12af8..7bf4129a9 100644 --- a/src-ui/src/app/components/chat/chat/chat.component.spec.ts +++ b/src-ui/src/app/components/chat/chat/chat.component.spec.ts @@ -80,8 +80,16 @@ describe('ChatComponent', () => { expect(component.messages()[0].content).toBe('Hello') expect(component.loading()).toBe(true) + fixture.detectChanges() + const messagesEl = fixture.nativeElement.querySelector('.chat-messages') + expect(messagesEl.querySelector('.spinner-border')).not.toBeNull() + expect(messagesEl.textContent).toContain('Thinking...') + mockStream$.next('Hi') expect(component.messages()[1].content).toBe('H') + fixture.detectChanges() + expect(messagesEl.querySelector('.spinner-border')).toBeNull() + expect(messagesEl.querySelector('.chat-markdown.streaming')).not.toBeNull() mockStream$.next('Hi there') // advance time to process the typewriter effect await jest.runAllTimersAsync() @@ -96,6 +104,8 @@ describe('ChatComponent', () => { await fixture.whenStable() expect(component.loading()).toBe(false) expect(component.messages()[1].isStreaming).toBe(false) + fixture.detectChanges() + expect(messagesEl.querySelector('.chat-markdown.streaming')).toBeNull() expect(fixture.nativeElement.querySelector('#chatInput').disabled).toBe( false ) @@ -123,6 +133,10 @@ describe('ChatComponent', () => { mockStream$.next( `Hi there${CHAT_METADATA_DELIMITER}{"references":[{"id":42,"title":"Bread Recipe"}]}` ) + fixture.detectChanges() + expect(fixture.nativeElement.querySelector('.chat-references')).toBeNull() + + mockStream$.complete() jest.advanceTimersByTime(1000) fixture.detectChanges() @@ -156,13 +170,96 @@ describe('ChatComponent', () => { component.input.set('Hello') component.sendMessage() + mockStream$.next('Partial') mockStream$.error('Error') - expect(component.messages()[1].content).toContain( - '⚠️ Error receiving response.' + expect(component.messages()[1].content).toBe( + 'Partial\n\n⚠️ Error receiving response.' ) expect(component.loading()).toBe(false) }) + it('should keep streaming until the typewriter catches up', () => { + component.input.set('Hello') + component.sendMessage() + + mockStream$.next('Hi there') + mockStream$.complete() + expect(component.messages()[1].isStreaming).toBe(true) + expect(component.loading()).toBe(true) + + jest.advanceTimersByTime(1000) + expect(component.messages()[1].content).toBe('Hi there') + expect(component.messages()[1].isStreaming).toBe(false) + expect(component.loading()).toBe(false) + }) + + it('should show a slow response message while waiting', () => { + component.input.set('Hello') + component.sendMessage() + fixture.detectChanges() + const messagesEl = fixture.nativeElement.querySelector('.chat-messages') + expect(messagesEl.textContent).not.toContain('Still thinking...') + + jest.advanceTimersByTime(8000) + fixture.detectChanges() + expect(messagesEl.textContent).toContain('Still thinking...') + + mockStream$.next('Hi') + expect(component.slowResponse()).toBe(false) + }) + + it('should stop streaming and keep the partial response', () => { + component.input.set('Hello') + component.sendMessage() + fixture.detectChanges() + const stopButton = fixture.nativeElement.querySelector('.chat-input button') + expect(stopButton.getAttribute('aria-label')).toBe('Stop') + + mockStream$.next('Hi there') + jest.advanceTimersByTime(20) + stopButton.click() + + expect(mockStream$.observed).toBe(false) + expect(component.messages()[1].content).toBe('Hi there') + expect(component.messages()[1].isStreaming).toBe(false) + expect(component.loading()).toBe(false) + + jest.advanceTimersByTime(1000) + expect(component.messages()[1].content).toBe('Hi there') + }) + + it('should drop the empty response when stopped before any content', () => { + component.input.set('Hello') + component.sendMessage() + component.stopStreaming() + + expect(component.messages()).toHaveLength(1) + expect(component.loading()).toBe(false) + component.stopStreaming() // no-op once stopped + expect(component.messages()).toHaveLength(1) + }) + + it('should clear the conversation', () => { + component.input.set('Hello') + component.sendMessage() + mockStream$.next('Hi there') + fixture.detectChanges() + + fixture.nativeElement.querySelector('button[title="Clear chat"]').click() + expect(component.messages()).toHaveLength(0) + expect(component.loading()).toBe(false) + expect(mockStream$.observed).toBe(false) + + fixture.detectChanges() + jest.advanceTimersByTime(10) + expect(document.activeElement).toBe( + fixture.nativeElement.querySelector('#chatInput') + ) + expect(fixture.nativeElement.textContent).toContain( + 'Answers come from your documents' + ) + }) + it('should enqueue typewriter chunks correctly', () => { const message = { content: '', role: 'assistant', isStreaming: true } component.enqueueTypewriter(null, message as any) // coverage for null @@ -207,4 +304,33 @@ describe('ChatComponent', () => { component.searchInputKeyDown(event) expect(component.sendMessage).not.toHaveBeenCalled() }) + + it('should render markdown for assistant messages only', () => { + component.messages.set([ + { role: 'user', content: '**user**' }, + { role: 'assistant', content: '**assistant** ' }, + ]) + fixture.detectChanges() + const el: HTMLElement = fixture.nativeElement + expect(el.querySelector('.chat-markdown strong')?.textContent).toBe( + 'assistant' + ) + expect(el.querySelector('.chat-markdown script')).toBeNull() + expect(el.textContent).toContain('**user**') + }) + + it('should keep the destination hostname visible after sanitizing chat links', () => { + component.messages.set([ + { + role: 'assistant', + content: + '[View original document](https://otherdomain.example/?data=secret)', + }, + ]) + fixture.detectChanges() + const el: HTMLElement = fixture.nativeElement + const link = el.querySelector('.chat-markdown a') + expect(link?.textContent).toBe('View original document') + expect(link?.nextElementSibling?.textContent).toBe('(otherdomain.example)') + }) }) diff --git a/src-ui/src/app/components/chat/chat/chat.component.ts b/src-ui/src/app/components/chat/chat/chat.component.ts index 4525808a4..a69a735c4 100644 --- a/src-ui/src/app/components/chat/chat/chat.component.ts +++ b/src-ui/src/app/components/chat/chat/chat.component.ts @@ -10,12 +10,16 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { NavigationEnd, Router, RouterModule } from '@angular/router' import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { filter, map } from 'rxjs' +import { filter, map, Subscription } from 'rxjs' +import { MarkdownPipe } from 'src/app/pipes/markdown.pipe' import { ChatMessage, ChatService, parseChatResponse, } from 'src/app/services/chat.service' +import { pngxPopperOptions } from 'src/app/utils/popper-options' + +const SLOW_RESPONSE_DELAY_MS = 8000 @Component({ selector: 'pngx-chat', @@ -25,6 +29,7 @@ import { RouterModule, NgxBootstrapIconsModule, NgbDropdownModule, + MarkdownPipe, ], templateUrl: './chat.component.html', styleUrl: './chat.component.scss', @@ -34,6 +39,8 @@ export class ChatComponent implements OnInit { readonly loading = signal(false) readonly input = signal('') readonly documentId = signal(undefined) + readonly slowResponse = signal(false) + public popperOptions = pngxPopperOptions private chatService: ChatService = inject(ChatService) private router: Router = inject(Router) @@ -43,6 +50,11 @@ export class ChatComponent implements OnInit { private typewriterBuffer: string[] = [] private typewriterActive = false + private typewriterTimeout: ReturnType + private streamSubscription: Subscription + private streamingMessage: ChatMessage + private streamFinished = false + private slowResponseTimeout: ReturnType public get placeholder(): string { return this.documentId() @@ -81,47 +93,96 @@ export class ChatComponent implements OnInit { } this.messages.update((messages) => [...messages, assistantMessage]) this.loading.set(true) + this.streamingMessage = assistantMessage + this.streamFinished = false + this.slowResponseTimeout = setTimeout( + () => this.slowResponse.set(true), + SLOW_RESPONSE_DELAY_MS + ) let lastVisibleContent = '' - this.chatService.streamChat(this.documentId(), this.input()).subscribe({ - next: (chunk) => { - const nextResponse = parseChatResponse(chunk) + this.streamSubscription = this.chatService + .streamChat(this.documentId(), this.input()) + .subscribe({ + next: (chunk) => { + this.clearSlowResponse() + const nextResponse = parseChatResponse(chunk) - if (nextResponse.content.length < lastVisibleContent.length) { - this.resetTypewriter(assistantMessage, nextResponse.content) - lastVisibleContent = nextResponse.content - } else { - const visibleDelta = nextResponse.content.substring( - lastVisibleContent.length - ) - lastVisibleContent = nextResponse.content - this.enqueueTypewriter(visibleDelta, assistantMessage) - } + if (nextResponse.content.length < lastVisibleContent.length) { + this.resetTypewriter(assistantMessage, nextResponse.content) + lastVisibleContent = nextResponse.content + } else { + const visibleDelta = nextResponse.content.substring( + lastVisibleContent.length + ) + lastVisibleContent = nextResponse.content + this.enqueueTypewriter(visibleDelta, assistantMessage) + } - assistantMessage.references = nextResponse.references - this.notifyMessagesChanged() - }, - error: () => { - assistantMessage.content += '\n\n⚠️ Error receiving response.' - assistantMessage.isStreaming = false - this.notifyMessagesChanged() - this.loading.set(false) - }, - complete: () => { - assistantMessage.isStreaming = false - this.notifyMessagesChanged() - this.loading.set(false) - this.scrollToBottom() - }, - }) + assistantMessage.references = nextResponse.references + this.notifyMessagesChanged() + }, + error: () => { + this.flushTypewriter(assistantMessage) + assistantMessage.content += '\n\n⚠️ Error receiving response.' + this.finishStreaming(assistantMessage) + }, + complete: () => { + // let the typewriter catch up before hiding the cursor + this.streamFinished = true + if (!this.typewriterActive) this.finishStreaming(assistantMessage) + }, + }) this.input.set('') } - private resetTypewriter(message: ChatMessage, content: string): void { + stopStreaming(): void { + const message = this.streamingMessage + if (!message?.isStreaming) return + + this.streamSubscription?.unsubscribe() + this.flushTypewriter(message) + if (!message.content) { + this.messages.update((messages) => messages.filter((m) => m !== message)) + } + this.finishStreaming(message) + } + + clearChat(): void { + this.stopStreaming() + this.messages.set([]) + setTimeout(() => this.chatInput?.nativeElement.focus()) + } + + private finishStreaming(message: ChatMessage): void { + this.clearSlowResponse() + this.streamFinished = false + message.isStreaming = false + this.notifyMessagesChanged() + this.loading.set(false) + this.scrollToBottom() + } + + private clearSlowResponse(): void { + clearTimeout(this.slowResponseTimeout) + this.slowResponse.set(false) + } + + private flushTypewriter(message: ChatMessage): void { + message.content += this.typewriterBuffer.join('') + this.cancelTypewriter() + } + + private cancelTypewriter(): void { + clearTimeout(this.typewriterTimeout) this.typewriterBuffer = [] this.typewriterActive = false + } + + private resetTypewriter(message: ChatMessage, content: string): void { + this.cancelTypewriter() message.content = content this.notifyMessagesChanged() this.scrollToBottom() @@ -141,6 +202,7 @@ export class ChatComponent implements OnInit { playTypewriter(message: ChatMessage): void { if (this.typewriterBuffer.length === 0) { this.typewriterActive = false + if (this.streamFinished) this.finishStreaming(message) return } @@ -149,7 +211,8 @@ export class ChatComponent implements OnInit { this.notifyMessagesChanged() this.scrollToBottom() - setTimeout(() => this.playTypewriter(message), 10) // 10ms per character + // 10ms per character + this.typewriterTimeout = setTimeout(() => this.playTypewriter(message), 10) } private notifyMessagesChanged(): void { diff --git a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.spec.ts b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.spec.ts index 3de750ce2..e00a6e0d1 100644 --- a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.spec.ts @@ -110,7 +110,7 @@ describe('CustomFieldsDropdownComponent', () => { let modal: NgbModalRef modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1])) const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') const getFieldsSpy = jest.spyOn( CustomFieldsDropdownComponent.prototype as any, 'getFields' diff --git a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts index ea68fa4b9..6d920742a 100644 --- a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts +++ b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts @@ -129,7 +129,9 @@ export class CustomFieldsDropdownComponent extends LoadingComponentWithPermissio modal.componentInstance.succeeded .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe((newField) => { - this.toastService.showInfo($localize`Saved field "${newField.name}".`) + this.toastService.showSuccess( + $localize`Saved field "${newField.name}".` + ) this.customFieldsService.clearCache() this.getFields() this.created.emit(newField) diff --git a/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.spec.ts b/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.spec.ts index f63a30657..0769eaaf4 100644 --- a/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.spec.ts @@ -151,7 +151,7 @@ describe('UserEditDialogComponent', () => { 'deactivateTotp' ) const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + const toastInfoSpy = jest.spyOn(toastService, 'showSuccess') deactivateSpy.mockReturnValueOnce(throwError(() => new Error('error'))) component.deactivateTotp() expect(deactivateSpy).toHaveBeenCalled() diff --git a/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts index cd9577545..c860d0180 100644 --- a/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts @@ -132,7 +132,7 @@ export class UserEditDialogComponent next: (result) => { this.totpLoading.set(false) if (result) { - this.toastService.showInfo($localize`Totp deactivated`) + this.toastService.showSuccess($localize`Totp deactivated`) this.object.is_mfa_enabled = false } else { this.toastService.showError($localize`Totp deactivation failed`) diff --git a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html index 1a4592183..d10194138 100644 --- a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html +++ b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -209,6 +209,7 @@ @if (isTagsFilter(filter.get('type').value)) { @@ -320,7 +321,7 @@
Remove tags
- +
Remove correspondents
diff --git a/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.spec.ts b/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.spec.ts index a9b885e1a..ca078bab6 100644 --- a/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.spec.ts @@ -52,7 +52,7 @@ describe('EmailDocumentDialogComponent', () => { it('should support sending single document via email, showing error if needed', () => { const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastSuccessSpy = jest.spyOn(toastService, 'showInfo') + const toastSuccessSpy = jest.spyOn(toastService, 'showSuccess') component.documentIds.set([1]) component.emailAddress = 'hello@paperless-ngx.com' component.emailSubject = 'Hello' @@ -73,7 +73,7 @@ describe('EmailDocumentDialogComponent', () => { it('should support sending multiple documents via email, showing appropriate messages', () => { const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastSuccessSpy = jest.spyOn(toastService, 'showInfo') + const toastSuccessSpy = jest.spyOn(toastService, 'showSuccess') component.documentIds.set([1, 2, 3]) component.emailAddress = 'hello@paperless-ngx.com' component.emailSubject = 'Hello' diff --git a/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.ts b/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.ts index 704a495d8..c97d8be0f 100644 --- a/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.ts +++ b/src-ui/src/app/components/common/email-document-dialog/email-document-dialog.component.ts @@ -50,7 +50,7 @@ export class EmailDocumentDialogComponent extends LoadingComponentWithPermission this.emailSubject = '' this.emailMessage = '' this.close() - this.toastService.showInfo($localize`Email sent`) + this.toastService.showSuccess($localize`Email sent`) }, error: (e) => { this.loading.set(false) diff --git a/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.html b/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.html index 3ba732dc5..1d715b6dc 100644 --- a/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.html +++ b/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.html @@ -1,5 +1,7 @@ @if (!accordion) { -
Permissions
+ @if (title?.length > 0) { +
{{title}}
+ } } @if (accordion) { diff --git a/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.ts b/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.ts index 4da6c9ca9..c09f4aac6 100644 --- a/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.ts +++ b/src-ui/src/app/components/common/input/permissions/permissions-form/permissions-form.component.ts @@ -59,6 +59,9 @@ export class PermissionsFormComponent @Input() accordion: boolean = false + @Input() + title: string = $localize`Permissions` + form = new FormGroup({ owner: new FormControl(null), set_permissions: new FormGroup({ diff --git a/src-ui/src/app/components/common/input/switch/switch.component.html b/src-ui/src/app/components/common/input/switch/switch.component.html index edd831e5c..636356d64 100644 --- a/src-ui/src/app/components/common/input/switch/switch.component.html +++ b/src-ui/src/app/components/common/input/switch/switch.component.html @@ -1,6 +1,6 @@ -
-
- @if (!horizontal) { +
+
+ @if (!horizontal && !compact) {