From f1ba2a2dbf272ad88a9c9319507f217018bd4735 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Tue, 29 Jul 2025 03:52:37 -0400 Subject: [PATCH] Add ability to block all users of an instance. (#5784) * Fixing a few optionals. * Fixing note. * Starting to work on instance user blocking. * Finishing up user instance blocking * SQL fmt * fmt. * Fixing search_combined * Fixing API tests. * Fixing api-common imports. * Fixing merge issues. * Update crates/api/api_utils/src/utils.rs Co-authored-by: Nutomic * Making clearer alias names * Submodules * Submodules 2 * Format * Remove api misc. * Upgrading lemmy js client, fixing merge * Prettier * Fixing merge. * Addressing PR comment. * Fix some stack overflows. * Fixing api tests. * Fixing notification joins. * Adding alias. * Fixing api test files. * Remove some tmp files. * Change back to localhost. * Remove instance_person and instance_communities actions from views. These are only used for internal filtering, blocks and bans anyway. * Removing a few unused joins. * Fix API tests. * Some lints. * Updating js-client * Try fixing test. * Update crates/db_views/site/src/api.rs Co-authored-by: dullbananas * Fixing blocked_instances save_user_settings. --------- Co-authored-by: Nutomic Co-authored-by: dullbananas --- api_tests/package.json | 22 +- api_tests/pnpm-lock.yaml | 2723 ++++++++--------- api_tests/pnpm-workspace.yaml | 2 + api_tests/src/community.spec.ts | 15 +- api_tests/src/post.spec.ts | 20 +- api_tests/src/shared.ts | 12 +- api_tests/src/tags.spec.ts | 2 +- api_tests/tsconfig.json | 2 +- .../api/src/local_user/user_block_instance.rs | 45 +- crates/api/api_common/src/federation.rs | 3 +- crates/api/api_crud/src/user/my_user.rs | 9 +- crates/api/api_utils/src/notify.rs | 22 +- crates/apub/src/api/user_settings_backup.rs | 24 +- crates/db_schema/src/impls/instance.rs | 111 +- crates/db_schema/src/impls/local_user.rs | 18 +- crates/db_schema/src/impls/post.rs | 2 +- crates/db_schema/src/lib.rs | 17 +- crates/db_schema/src/source/instance.rs | 20 +- crates/db_schema/src/utils/queries.rs | 38 +- crates/db_schema_file/src/schema.rs | 3 +- crates/db_views/comment/src/impls.rs | 21 +- crates/db_views/comment/src/lib.rs | 10 +- crates/db_views/community/src/impls.rs | 8 +- crates/db_views/community/src/lib.rs | 3 - crates/db_views/notification/src/impls.rs | 36 +- crates/db_views/notification/src/lib.rs | 15 +- .../person_content_combined/src/impls.rs | 12 +- .../person_content_combined/src/lib.rs | 7 +- .../person_liked_combined/src/impls.rs | 15 +- .../db_views/person_liked_combined/src/lib.rs | 7 +- .../person_saved_combined/src/impls.rs | 12 +- .../db_views/person_saved_combined/src/lib.rs | 8 +- crates/db_views/post/src/impls.rs | 155 +- crates/db_views/post/src/lib.rs | 5 - crates/db_views/search_combined/src/impls.rs | 13 +- crates/db_views/search_combined/src/lib.rs | 3 - crates/db_views/site/src/api.rs | 22 +- crates/db_views/site/src/impls.rs | 3 +- crates/federate/src/inboxes.rs | 2 +- crates/utils/src/error.rs | 3 +- .../down.sql | 5 + .../up.sql | 9 + src/api_routes.rs | 8 +- 43 files changed, 1811 insertions(+), 1681 deletions(-) create mode 100644 api_tests/pnpm-workspace.yaml create mode 100644 migrations/2025-06-12-164319_instance_block_communities_persons/down.sql create mode 100644 migrations/2025-06-12-164319_instance_block_communities_persons/up.sql diff --git a/api_tests/package.json b/api_tests/package.json index a6f61eccf..d2fd0c7fa 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -22,20 +22,20 @@ "api-test-tags": "jest -i tags.spec.ts" }, "devDependencies": { - "@eslint/js": "^9.26.0", - "@types/jest": "^29.5.12", - "@types/node": "^22.15.14", - "@typescript-eslint/eslint-plugin": "^8.32.0", - "@typescript-eslint/parser": "^8.32.0", - "eslint": "^9.26.0", - "eslint-plugin-prettier": "^5.4.0", - "jest": "^29.5.0", + "@eslint/js": "^9.29.0", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.3", + "@typescript-eslint/eslint-plugin": "^8.34.1", + "@typescript-eslint/parser": "^8.34.1", + "eslint": "^9.29.0", + "eslint-plugin-prettier": "^5.5.0", + "jest": "^30.0.0", "joi": "^17.13.3", - "lemmy-js-client": "1.0.0-post-tags.3", + "lemmy-js-client": "1.0.0-instance-user-blocking.8", "prettier": "^3.5.3", - "ts-jest": "^29.3.2", + "ts-jest": "^29.4.0", "tsoa": "^6.6.0", "typescript": "^5.8.3", - "typescript-eslint": "^8.32.0" + "typescript-eslint": "^8.34.1" } } diff --git a/api_tests/pnpm-lock.yaml b/api_tests/pnpm-lock.yaml index 8a83ce8e8..3463b1786 100644 --- a/api_tests/pnpm-lock.yaml +++ b/api_tests/pnpm-lock.yaml @@ -9,41 +9,41 @@ importers: .: devDependencies: '@eslint/js': - specifier: ^9.26.0 - version: 9.26.0 + specifier: ^9.29.0 + version: 9.29.0 '@types/jest': - specifier: ^29.5.12 - version: 29.5.14 + specifier: ^30.0.0 + version: 30.0.0 '@types/node': - specifier: ^22.15.14 - version: 22.15.14 + specifier: ^24.0.3 + version: 24.0.3 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.0 - version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) + specifier: ^8.34.1 + version: 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.0 - version: 8.32.0(eslint@9.26.0)(typescript@5.8.3) + specifier: ^8.34.1 + version: 8.34.1(eslint@9.29.0)(typescript@5.8.3) eslint: - specifier: ^9.26.0 - version: 9.26.0 + specifier: ^9.29.0 + version: 9.29.0 eslint-plugin-prettier: - specifier: ^5.4.0 - version: 5.4.0(eslint@9.26.0)(prettier@3.5.3) + specifier: ^5.5.0 + version: 5.5.0(eslint@9.29.0)(prettier@3.5.3) jest: - specifier: ^29.5.0 - version: 29.7.0(@types/node@22.15.14) + specifier: ^30.0.0 + version: 30.0.0(@types/node@24.0.3) joi: specifier: ^17.13.3 version: 17.13.3 lemmy-js-client: - specifier: 1.0.0-post-tags.3 - version: 1.0.0-post-tags.3 + specifier: 1.0.0-instance-user-blocking.8 + version: 1.0.0-instance-user-blocking.8 prettier: specifier: ^3.5.3 version: 3.5.3 ts-jest: - specifier: ^29.3.2 - version: 29.3.2(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.15.14))(typescript@5.8.3) + specifier: ^29.4.0 + version: 29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.0)(@jest/types@30.0.0)(babel-jest@30.0.0(@babel/core@7.27.4))(jest-util@30.0.0)(jest@30.0.0(@types/node@24.0.3))(typescript@5.8.3) tsoa: specifier: ^6.6.0 version: 6.6.0 @@ -51,91 +51,67 @@ importers: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.32.0 - version: 8.32.0(eslint@9.26.0)(typescript@5.8.3) + specifier: ^8.34.1 + version: 8.34.1(eslint@9.29.0)(typescript@5.8.3) packages: - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.9': - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.23.9': - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.23.9': - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -154,6 +130,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -164,8 +152,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.23.3': - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -200,38 +188,47 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.23.3': - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.23.9': - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.9': - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.9': - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} @@ -243,32 +240,36 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.1': - resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} + '@eslint/js@9.29.0': + resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@hapi/accept@6.0.3': @@ -384,8 +385,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': @@ -400,93 +401,108 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@30.0.0': + resolution: {integrity: sha512-vfpJap6JZQ3I8sUN8dsFqNAKJYO4KIGxkcB+3Fw7Q/BJiWY5HwtMMiuT1oP0avsiDhjE/TCLaDgbGfHwDdBVeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/core@30.0.0': + resolution: {integrity: sha512-1zU39zFtWSl5ZuDK3Rd6P8S28MmS4F11x6Z4CURrgJ99iaAJg68hmdJ2SAHEEO6ociaNk43UhUYtHxWKEWoNYw==} + 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 peerDependenciesMeta: node-notifier: optional: true - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/diff-sequences@30.0.0': + resolution: {integrity: sha512-xMbtoCeKJDto86GW6AiwVv7M4QAuI56R7dVBr1RNGYbOT44M2TIzOiske2RxopBqkumDY+A1H55pGvuribRY9A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@30.0.0': + resolution: {integrity: sha512-09sFbMMgS5JxYnvgmmtwIHhvoyzvR5fUPrVl8nOCrC5KdzmmErTcAxfWyAhJ2bv3rvHNQaKiS+COSG+O7oNbXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@30.0.0': + resolution: {integrity: sha512-UiWfsqNi/+d7xepfOv8KDcbbzcYtkWBe3a3kVDtg6M1kuN6CJ7b4HzIp5e1YHrSaQaVS8sdCoyCMCZClTLNKFQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@30.0.0': + resolution: {integrity: sha512-XZ3j6syhMeKiBknmmc8V3mNIb44kxLTbOQtaXA4IFdHy+vEN0cnXRzbRjdGBtrp4k1PWyMWNU3Fjz3iejrhpQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@30.0.0': + resolution: {integrity: sha512-yzBmJcrMHAMcAEbV2w1kbxmx8WFpEz8Cth3wjLMSkq+LO8VeGKRhpr5+BUp7PPK+x4njq/b6mVnDR8e/tPL5ng==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/get-type@30.0.0': + resolution: {integrity: sha512-VZWMjrBzqfDKngQ7sUctKeLxanAbsBFoZnPxNIG6CmxK7Gv6K44yqd0nzveNIBfuhGZMmk1n5PGbvdSTOu0yTg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.0.0': + resolution: {integrity: sha512-OEzYes5A1xwBJVMPqFRa8NCao8Vr42nsUZuf/SpaJWoLE+4kyl6nCQZ1zqfipmCrIXQVALC5qJwKy/7NQQLPhw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.0': + resolution: {integrity: sha512-k+TpEThzLVXMkbdxf8KHjZ83Wl+G54ytVJoDIGWwS96Ql4xyASRjc6SU1hs5jHVql+hpyK9G8N7WuFhLpGHRpQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.0.0': + resolution: {integrity: sha512-5WHNlLO0Ok+/o6ML5IzgVm1qyERtLHBNhwn67PAq92H4hZ+n5uW/BYj1VVwmTdxIcNrZLxdV9qtpdZkXf16HxA==} + 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 peerDependenciesMeta: node-notifier: optional: true - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.0': + resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/snapshot-utils@30.0.0': + resolution: {integrity: sha512-C/QSFUmvZEYptg2Vin84FggAphwHvj6la39vkw1CNOZQORWZ7O/H0BXmdeeeGnvlXDYY8TlFM5jgFnxLAxpFjA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@30.0.0': + resolution: {integrity: sha512-oYBJ4d/NF4ZY3/7iq1VaeoERHRvlwKtrGClgescaXMIa1mmb+vfJd0xMgbW9yrI80IUA7qGbxpBWxlITrHkWoA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@30.0.0': + resolution: {integrity: sha512-685zco9HdgBaaWiB9T4xjLtBuN0Q795wgaQPpmuAeZPHwHZSoKFAUnozUtU+ongfi4l5VCz8AclOE5LAQdyjxQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@30.0.0': + resolution: {integrity: sha512-Hmvv5Yg6UmghXIcVZIydkT0nAK7M/hlXx9WMHR5cLVwdmc14/qUQt3mC72T6GN0olPC6DhmKE6Cd/pHsgDbuqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.0.0': + resolution: {integrity: sha512-8xhpsCGYJsUjqpJOgLyMkeOSSlhqggFZEWAnZquBsvATtueoEs7CkMRxOUmJliF3E5x+mXmZ7gEEsHank029Og==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jest/types@30.0.0': + resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@modelcontextprotocol/sdk@1.11.0': - resolution: {integrity: sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==} - engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -504,8 +520,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@sideway/address@4.1.5': @@ -517,14 +533,14 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.35': + resolution: {integrity: sha512-C6ypdODf2VZkgRT6sFM8E1F8vR+HcffniX0Kp8MsU8PIfrlXbNCBz0jzj17GjdmjTx1OtZzdH8+iALL21UjF5A==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} '@tsoa/cli@6.6.0': resolution: {integrity: sha512-thSW0EiqjkF7HspcPIVIy0ZX65VqbWALHbxwl8Sk83j2kakOMq+fJvfo8FcBAWlMki+JDH7CO5iaAaSLHbeqtg==} @@ -535,20 +551,23 @@ packages: resolution: {integrity: sha512-+rF2gdL8CX+jQ82/IBc+MRJFNAvWPoBBl77HHJv3ESVMqbKhlhlo97JHmKyFbLcX6XOJN8zl8gfQpAEJN4SOMQ==} engines: {node: '>=18.0.0', yarn: '>=1.9.4'} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -562,8 +581,8 @@ packages: '@types/cookies@0.9.0': resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} @@ -571,9 +590,6 @@ packages: '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/http-assert@1.5.6': resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} @@ -589,8 +605,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -610,8 +626,8 @@ packages: '@types/multer@1.4.12': resolution: {integrity: sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==} - '@types/node@22.15.14': - resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} + '@types/node@24.0.3': + resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} @@ -631,71 +647,177 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.32.0': - resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} + '@typescript-eslint/eslint-plugin@8.34.1': + resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.34.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.32.0': - resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} + '@typescript-eslint/parser@8.34.1': + resolution: {integrity: sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.0': - resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} + '@typescript-eslint/project-service@8.34.1': + resolution: {integrity: sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.34.1': + resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.32.0': - resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} + '@typescript-eslint/tsconfig-utils@8.34.1': + resolution: {integrity: sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.34.1': + resolution: {integrity: sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.32.0': - resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} + '@typescript-eslint/types@8.34.1': + resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.32.0': - resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} + '@typescript-eslint/typescript-estree@8.34.1': + resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.0': - resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} + '@typescript-eslint/utils@8.34.1': + resolution: {integrity: sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.32.0': - resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} + '@typescript-eslint/visitor-keys@8.34.1': + resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.9.0': + resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.9.0': + resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==} + cpu: [x64] + os: [win32] + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - 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: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -742,30 +864,30 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-jest@30.0.0: + resolution: {integrity: sha512-JQ0DhdFjODbSawDf0026uZuwaqfKkQzk+9mwWkq2XkKFIaMhFVOxlVmbFCOnnC76jATdxrff3IiUAvOAJec6tw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.8.0 + '@babel/core': ^7.11.0 - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@30.0.0: + resolution: {integrity: sha512-DSRm+US/FCB4xPDD6Rnslb6PAF9Bej1DZ+1u4aTiqJnk7ZX12eHsnDiIOqjGvITCq+u6wLqUhgS+faCNbVY8+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-preset-jest@30.0.0: + resolution: {integrity: sha512-hgEuu/W7gk8QOWUA9+m3Zk+WpGvKc1Egp6rFQEfYxEoM9Fk/q8nuTXNL65OkhwGrTApauEGgakOoWVXj+UfhKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.11.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -774,26 +896,21 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -831,8 +948,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001581: - resolution: {integrity: sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==} + caniuse-lite@1.0.30001723: + resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -842,12 +959,12 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -874,10 +991,6 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -888,31 +1001,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -925,8 +1017,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -934,8 +1026,8 @@ packages: supports-color: optional: true - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -961,10 +1053,6 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -980,8 +1068,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.648: - resolution: {integrity: sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==} + electron-to-chromium@1.5.169: + resolution: {integrity: sha512-q7SQx6mkLy0GTJK9K9OiWeaBMV4XQtBSdf6MJUzDB/H/5tFXfIiX38Lci1Kl6SsgiEhz1SQI1ejEOU5asWEhwQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1020,6 +1108,10 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1031,8 +1123,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-prettier@5.4.0: - resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} + eslint-plugin-prettier@5.5.0: + resolution: {integrity: sha512-8qsOYwkkGrahrgoUv76NZi23koqXOGiiEzXMrT8Q7VcYaUISR+5MorIUxfWqYXN0fN/31WbSrxCxFkVQ43wwrA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1045,20 +1137,20 @@ packages: eslint-config-prettier: optional: true - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1067,8 +1159,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -1096,40 +1188,22 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eventsource-parser@3.0.1: - resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.6: - resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} - engines: {node: '>=18.0.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} - engines: {node: '>= 16'} - peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 + expect@30.0.0: + resolution: {integrity: sha512-xCdPp6gwiR9q9lsPCHANarIkFTN/IMZso6Kkq03sOm9IIGtzK/UJqml0dkhHibGh8HKOj8BIDIpZ0BZuU7QK6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1159,10 +1233,6 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1171,10 +1241,6 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1202,10 +1268,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} @@ -1292,10 +1354,6 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1315,20 +1373,20 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true @@ -1350,9 +1408,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1373,9 +1428,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -1391,24 +1443,20 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} jackspeak@3.4.3: @@ -1419,17 +1467,17 @@ packages: engines: {node: '>=10'} hasBin: true - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@30.0.0: + resolution: {integrity: sha512-rzGpvCdPdEV1Ma83c1GbZif0L2KAm3vXSXGRlpx7yCt0vhruwCNouKNRh3SiVcISHP1mb3iJzjb7tAEnNu1laQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@30.0.0: + resolution: {integrity: sha512-nTwah78qcKVyndBS650hAkaEmwWGaVsMMoWdJwMnH77XArRJow2Ir7hc+8p/mATtxVZuM9OTkA/3hQocRIK5Dw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-cli@30.0.0: + resolution: {integrity: sha512-fWKAgrhlwVVCfeizsmIrPRTBYTzO82WSba3gJniZNR3PKXADgdC0mmCSK+M+t7N8RCXOVfY6kvCkvjUNtzmHYQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1437,57 +1485,56 @@ packages: node-notifier: optional: true - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-config@30.0.0: + resolution: {integrity: sha512-p13a/zun+sbOMrBnTEUdq/5N7bZMOGd1yMfqtAJniPNuzURMay4I+vxZLK1XSDbjvIhmeVdG8h8RznqYyjctyg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.0.0: + resolution: {integrity: sha512-TgT1+KipV8JTLXXeFX0qSvIJR/UXiNNojjxb/awh3vYlBZyChU/NEmyKmq+wijKjWEztyrGJFL790nqMqNjTHA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@30.0.0: + resolution: {integrity: sha512-By/iQ0nvTzghEecGzUMCp1axLtBh+8wB4Hpoi5o+x1stycjEmPcH1mHugL4D9Q+YKV++vKeX/3ZTW90QC8ICPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@30.0.0: + resolution: {integrity: sha512-qkFEW3cfytEjG2KtrhwtldZfXYnWSanO8xUMXLe4A6yaiHMHJUalk0Yyv4MQH6aeaxgi4sGVrukvF0lPMM7U1w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@30.0.0: + resolution: {integrity: sha512-sF6lxyA25dIURyDk4voYmGU9Uwz2rQKMfjxKnDd19yk+qxKGrimFqS5YsPHWTlAVBo+YhWzXsqZoaMzrTFvqfg==} + 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.0.0: + resolution: {integrity: sha512-p4bXAhXTawTsADgQgTpbymdLaTyPW1xWNu1oIGG7/N3LIAbZVkH2JMJqS8/IUcnGR8Kc7WFE+vWbJvsqGCWZXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@30.0.0: + resolution: {integrity: sha512-E/ly1azdVVbZrS0T6FIpyYHvsdek4FNaThJTtggjV/8IpKxh3p9NLndeUZy2+sjAI3ncS+aM0uLLon/dBg8htA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@30.0.0: + resolution: {integrity: sha512-m5mrunqopkrqwG1mMdJxe1J4uGmS9AHHKYUmoxeQOxBcLjEvirIrIDwuKmUYrecPHVB/PUBpXs2gPoeA2FSSLQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.0.0: + resolution: {integrity: sha512-pV3qcrb4utEsa/U7UI2VayNzSDQcmCllBZLSoIucrESRu0geKThFZOjjh0kACDJFJRAQwsK7GVsmS6SpEceD8w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@30.0.0: + resolution: {integrity: sha512-W2sRA4ALXILrEetEOh2ooZG6fZ01iwVs0OWMKSSWRcUlaLr4ESHuiKXDNTg+ZVgOq8Ei5445i/Yxrv59VT+XkA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} @@ -1498,49 +1545,49 @@ packages: jest-resolve: optional: true - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.0.0: + resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@30.0.0: + resolution: {integrity: sha512-Yhh7odCAUNXhluK1bCpwIlHrN1wycYaTlZwq1GdfNBEESNNI/z1j1a7dUEWHbmB9LGgv0sanxw3JPmWU8NeebQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@30.0.0: + resolution: {integrity: sha512-zwWl1P15CcAfuQCEuxszjiKdsValhnWcj/aXg/R3aMHs8HVoCWHC4B/+5+1BirMoOud8NnN85GSP2LEZCbj3OA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@30.0.0: + resolution: {integrity: sha512-xbhmvWIc8X1IQ8G7xTv0AQJXKjBVyxoVJEJgy7A4RXsSaO+k/1ZSBbHwjnUhvYqMvwQPomWssDkUx6EoidEhlw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@30.0.0: + resolution: {integrity: sha512-/O07qVgFrFAOGKGigojmdR3jUGz/y3+a/v9S/Yi2MHxsD+v6WcPppglZJw0gNJkRBArRDK8CFAwpM/VuEiiRjA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@30.0.0: + resolution: {integrity: sha512-6oCnzjpvfj/UIOMTqKZ6gedWAUgaycMdV8Y8h2dRJPvc2wSjckN03pzeoonw8y33uVngfx7WMo1ygdRGEKOT7w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.0: + resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@30.0.0: + resolution: {integrity: sha512-d6OkzsdlWItHAikUDs1hlLmpOIRhsZoXTCliV2XXalVQ3ZOeb9dy0CQ6AKulJu/XOZqpOEr/FiMH+FeOBVV+nw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@30.0.0: + resolution: {integrity: sha512-fbAkojcyS53bOL/B7XYhahORq9cIaPwOgd/p9qW/hybbC8l6CzxfWJJxjlPBAIVN8dRipLR0zdhpGQdam+YBtw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.0.0: + resolution: {integrity: sha512-VZvxfWIybIvwK8N/Bsfe43LfQgd/rD0c4h5nLUx78CAqPxIQcW2qDjsVAC53iUR8yxzFIeCFFvWOh8en8hGzdg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest@30.0.0: + resolution: {integrity: sha512-/3G2iFwsUY95vkflmlDn/IdLyLWqpQXcftptooaPH4qkyU52V7qVYf1BjmdSPlp1+0fs6BmNtrGaSFwOfV07ew==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1562,9 +1609,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -1590,12 +1637,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - lemmy-js-client@1.0.0-post-tags.3: - resolution: {integrity: sha512-vUZfQ4420gaGODdHKw8VJhJQsUBVaAcSa9f/Z9x0X98GRnkWDris2YrsjsLtoZ0YZ1Pe5vfYQSjSUH/1lLpfkg==} + lemmy-js-client@1.0.0-instance-user-blocking.8: + resolution: {integrity: sha512-hJhb5lJK4iDPb7K2MbodEFT0pliO5mwyL67YqE/opnkUo/LibdsbkSn3Himg6AcdnGv9lWnOUnZbwxrIvGLB1g==} leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -1646,10 +1689,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -1657,10 +1696,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - 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==} @@ -1672,10 +1707,6 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1692,10 +1723,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -1729,6 +1756,11 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1736,18 +1768,14 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -1757,10 +1785,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - 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'} @@ -1827,9 +1851,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1837,10 +1858,6 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1848,13 +1865,13 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -1873,13 +1890,9 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + pretty-format@30.0.0: + resolution: {integrity: sha512-18NAOUr4ZOQiIR+BgI5NhQE7uREdx4ZyV0dyay5izh4yfQ+1T7BSvggxvRGoXocrRyevqW5OhScUjbi9GB8R8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -1889,17 +1902,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1911,10 +1920,6 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -1937,22 +1942,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1966,13 +1959,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -1980,18 +1968,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -2026,9 +2006,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2091,12 +2068,8 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.11.4: - resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} test-exclude@6.0.0: @@ -2106,10 +2079,6 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2128,17 +2097,18 @@ packages: resolution: {integrity: sha512-akcpDTPuez4xzULo5NwuoKwYRtjQJ9eoNfBACiBMaXwNAx7B1PKfe5wqUFJuW5uKzQ68YjDFwPaWHDG1KnFGsA==} engines: {node: '>=14.13.1'} - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-jest@29.4.0: + resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' - jest: ^29.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': @@ -2151,6 +2121,8 @@ packages: optional: true esbuild: optional: true + jest-util: + optional: true tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2172,20 +2144,16 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@4.40.1: - resolution: {integrity: sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - - typescript-eslint@8.32.0: - resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==} + typescript-eslint@8.34.1: + resolution: {integrity: sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2201,8 +2169,8 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -2212,8 +2180,11 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + unrs-resolver@1.9.0: + resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2225,8 +2196,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} validator@13.12.0: @@ -2263,9 +2234,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -2291,248 +2262,246 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} - peerDependencies: - zod: ^3.24.1 - - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - snapshots: - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.27.5': {} - '@babel/core@7.23.9': + '@babel/core@7.27.4': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helpers': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': + '@babel/generator@7.27.5': dependencies: - '@babel/types': 7.23.9 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 - jsesc: 2.5.2 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.3 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/template': 7.23.9 - '@babel/types': 7.23.9 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.23.9 - - '@babel/helper-module-imports@7.22.15': - dependencies: - '@babel/types': 7.23.9 - - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/helper-plugin-utils@7.22.5': {} - - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.23.9 - - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.23.9 - - '@babel/helper-string-parser@7.23.4': {} - - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.23.5': {} - - '@babel/helpers@7.23.9': - dependencies: - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/parser@7.23.9': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/types': 7.23.9 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-string-parser@7.27.1': {} - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option@7.27.1': {} - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': + '@babel/helpers@7.27.6': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': + '@babel/parser@7.27.5': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.27.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/template@7.23.9': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse@7.23.9': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - debug: 4.4.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.9': + '@babel/types@7.27.6': dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} - '@eslint-community/eslint-utils@4.6.1(eslint@9.26.0)': + '@emnapi/core@1.4.3': dependencies: - eslint: 9.26.0 - eslint-visitor-keys: 3.4.3 + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': + '@emnapi/runtime@1.4.3': dependencies: - eslint: 9.26.0 + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0)': + dependencies: + eslint: 9.29.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.20.1': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.1': {} + '@eslint/config-helpers@0.2.3': {} - '@eslint/core@0.13.0': + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -2542,13 +2511,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.26.0': {} + '@eslint/js@9.29.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.3.2': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.15.0 levn: 0.4.1 '@hapi/accept@6.0.3': @@ -2731,7 +2700,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -2752,199 +2721,208 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@29.7.0': + '@jest/console@30.0.0': dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + jest-message-util: 30.0.0 + jest-util: 30.0.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@30.0.0': dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/console': 30.0.0 + '@jest/pattern': 30.0.0 + '@jest/reporters': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 + ci-info: 4.2.0 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.14) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 + jest-changed-files: 30.0.0 + jest-config: 30.0.0(@types/node@24.0.3) + jest-haste-map: 30.0.0 + jest-message-util: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-resolve-dependencies: 30.0.0 + jest-runner: 30.0.0 + jest-runtime: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 + jest-watcher: 30.0.0 + micromatch: 4.0.8 + pretty-format: 30.0.0 slash: 3.0.0 - strip-ansi: 6.0.1 transitivePeerDependencies: - babel-plugin-macros + - esbuild-register - supports-color - ts-node - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 - jest-mock: 29.7.0 + '@jest/diff-sequences@30.0.0': {} - '@jest/expect-utils@29.7.0': + '@jest/environment@30.0.0': dependencies: - jest-get-type: 29.6.3 + '@jest/fake-timers': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 + jest-mock: 30.0.0 - '@jest/expect@29.7.0': + '@jest/expect-utils@30.0.0': dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 + '@jest/get-type': 30.0.0 + + '@jest/expect@30.0.0': + dependencies: + expect: 30.0.0 + jest-snapshot: 30.0.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.7.0': + '@jest/fake-timers@30.0.0': dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.14 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/types': 30.0.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 24.0.3 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-util: 30.0.0 - '@jest/globals@29.7.0': + '@jest/get-type@30.0.0': {} + + '@jest/globals@30.0.0': dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + '@jest/environment': 30.0.0 + '@jest/expect': 30.0.0 + '@jest/types': 30.0.0 + jest-mock: 30.0.0 transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0': + '@jest/pattern@30.0.0': + dependencies: + '@types/node': 24.0.3 + jest-regex-util: 30.0.0 + + '@jest/reporters@30.0.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.22 - '@types/node': 22.15.14 + '@jest/console': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 24.0.3 chalk: 4.1.2 collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 + exit-x: 0.2.2 + glob: 10.4.5 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.1 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + jest-message-util: 30.0.0 + jest-util: 30.0.0 + jest-worker: 30.0.0 slash: 3.0.0 string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.3': + '@jest/schemas@30.0.0': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.34.35 - '@jest/source-map@29.6.3': + '@jest/snapshot-utils@30.0.0': dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jest/types': 30.0.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.0': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@29.7.0': + '@jest/test-result@30.0.0': dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 30.0.0 + '@jest/types': 30.0.0 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@29.7.0': + '@jest/test-sequencer@30.0.0': dependencies: - '@jest/test-result': 29.7.0 + '@jest/test-result': 30.0.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 + jest-haste-map: 30.0.0 slash: 3.0.0 - '@jest/transform@29.7.0': + '@jest/transform@30.0.0': dependencies: - '@babel/core': 7.23.9 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.22 - babel-plugin-istanbul: 6.1.1 + '@babel/core': 7.27.4 + '@jest/types': 30.0.0 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 7.0.0 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: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 + jest-haste-map: 30.0.0 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + micromatch: 4.0.8 + pirates: 4.0.7 slash: 3.0.0 - write-file-atomic: 4.0.2 + write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': + '@jest/types@30.0.0': dependencies: - '@jest/schemas': 29.6.3 + '@jest/pattern': 30.0.0 + '@jest/schemas': 30.0.0 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.14 - '@types/yargs': 17.0.32 + '@types/node': 24.0.3 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.22': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@modelcontextprotocol/sdk@1.11.0': + '@napi-rs/wasm-runtime@0.2.11': dependencies: - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) - transitivePeerDependencies: - - supports-color + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2961,7 +2939,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.4': {} + '@pkgr/core@0.2.7': {} '@sideway/address@4.1.5': dependencies: @@ -2971,13 +2949,13 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.35': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': + '@sinonjs/fake-timers@13.0.5': dependencies: '@sinonjs/commons': 3.0.1 @@ -3010,39 +2988,44 @@ snapshots: transitivePeerDependencies: - supports-color + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + '@types/accepts@1.3.7': dependencies: - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.27.6 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/content-disposition@0.5.8': {} @@ -3051,13 +3034,13 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.0 '@types/keygrip': 1.0.6 - '@types/node': 22.15.14 + '@types/node': 24.0.3 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -3069,10 +3052,6 @@ snapshots: '@types/qs': 6.9.18 '@types/serve-static': 1.15.7 - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 22.15.14 - '@types/http-assert@1.5.6': {} '@types/http-errors@2.0.4': {} @@ -3087,10 +3066,10 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.14': + '@types/jest@30.0.0': dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: 30.0.0 + pretty-format: 30.0.0 '@types/json-schema@7.0.15': {} @@ -3109,7 +3088,7 @@ snapshots: '@types/http-errors': 2.0.4 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/mime@1.3.5': {} @@ -3117,9 +3096,9 @@ snapshots: dependencies: '@types/express': 5.0.0 - '@types/node@22.15.14': + '@types/node@24.0.3': dependencies: - undici-types: 6.21.0 + undici-types: 7.8.0 '@types/qs@6.9.18': {} @@ -3128,114 +3107,185 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.15.14 + '@types/node': 24.0.3 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.32': + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 - eslint: 9.26.0 + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.34.1 + '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.34.1 + eslint: 9.29.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 - eslint: 9.26.0 + '@typescript-eslint/scope-manager': 8.34.1 + '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.34.1 + debug: 4.4.1 + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.0': + '@typescript-eslint/project-service@8.34.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) + '@typescript-eslint/types': 8.34.1 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.34.1': dependencies: - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.26.0 + '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/visitor-keys': 8.34.1 + + '@typescript-eslint/tsconfig-utils@8.34.1(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.29.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.0': {} + '@typescript-eslint/types@8.34.1': {} - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.34.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.34.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) + '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/visitor-keys': 8.34.1 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.0(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.34.1(eslint@9.29.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - eslint: 9.26.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@typescript-eslint/scope-manager': 8.34.1 + '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.0': + '@typescript-eslint/visitor-keys@8.34.1': dependencies: - '@typescript-eslint/types': 8.32.0 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.34.1 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + optional: true + + '@unrs/resolver-binding-android-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + optional: true accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - accepts@2.0.0: + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} + acorn@8.15.0: {} ajv@6.12.6: dependencies: @@ -3275,57 +3325,59 @@ snapshots: async@3.2.6: {} - babel-jest@29.7.0(@babel/core@7.23.9): + babel-jest@30.0.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.23.9 - '@jest/transform': 29.7.0 + '@babel/core': 7.27.4 + '@jest/transform': 30.0.0 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.9) + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.0(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-plugin-istanbul@7.0.0: dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@29.6.3: + babel-plugin-jest-hoist@30.0.0: dependencies: - '@babel/template': 7.23.9 - '@babel/types': 7.23.9 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - babel-preset-jest@29.6.3(@babel/core@7.23.9): + babel-preset-jest@30.0.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.23.9 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + '@babel/core': 7.27.4 + babel-plugin-jest-hoist: 30.0.0 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) balanced-match@1.0.2: {} @@ -3346,21 +3398,7 @@ snapshots: transitivePeerDependencies: - supports-color - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.0 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -3369,20 +3407,20 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + brace-expansion@2.0.2: dependencies: - fill-range: 7.0.1 + balanced-match: 1.0.2 braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.22.3: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001581 - electron-to-chromium: 1.4.648 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.3) + caniuse-lite: 1.0.30001723 + electron-to-chromium: 1.5.169 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs-logger@0.2.6: dependencies: @@ -3412,7 +3450,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001581: {} + caniuse-lite@1.0.30001723: {} chalk@4.1.2: dependencies: @@ -3421,9 +3459,9 @@ snapshots: char-regex@1.0.2: {} - ci-info@3.9.0: {} + ci-info@4.2.0: {} - cjs-module-lexer@1.2.3: {} + cjs-module-lexer@2.1.0: {} cliui@8.0.1: dependencies: @@ -3447,48 +3485,14 @@ snapshots: dependencies: safe-buffer: 5.2.1 - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - content-type@1.0.5: {} convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} - cookie-signature@1.2.2: {} - cookie@0.7.1: {} - cookie@0.7.2: {} - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - create-jest@29.7.0(@types/node@22.15.14): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.14) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3499,11 +3503,11 @@ snapshots: dependencies: ms: 2.0.0 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 - dedent@1.5.1: {} + dedent@1.6.0: {} deep-is@0.1.4: {} @@ -3515,8 +3519,6 @@ snapshots: detect-newline@3.1.0: {} - diff-sequences@29.6.3: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3531,7 +3533,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.4.648: {} + electron-to-chromium@1.5.169: {} emittery@0.13.1: {} @@ -3557,52 +3559,53 @@ snapshots: escalade@3.1.1: {} + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} - eslint-plugin-prettier@5.4.0(eslint@9.26.0)(prettier@3.5.3): + eslint-plugin-prettier@5.5.0(eslint@9.29.0)(prettier@3.5.3): dependencies: - eslint: 9.26.0 + eslint: 9.29.0 prettier: 3.5.3 prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 + synckit: 0.11.8 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.26.0: + eslint@9.29.0: dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.26.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.1 - '@eslint/core': 0.13.0 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.2 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@modelcontextprotocol/sdk': 1.11.0 - '@types/estree': 1.0.7 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3617,15 +3620,14 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.24.4 transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -3643,15 +3645,9 @@ snapshots: etag@1.8.1: {} - eventsource-parser@3.0.1: {} - - eventsource@3.0.6: - dependencies: - eventsource-parser: 3.0.1 - execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -3661,19 +3657,16 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - exit@0.1.2: {} + exit-x@0.2.2: {} - expect@29.7.0: + expect@30.0.0: dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 + '@jest/expect-utils': 30.0.0 + '@jest/get-type': 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-util: 30.0.0 express@4.21.2: dependencies: @@ -3711,38 +3704,6 @@ snapshots: transitivePeerDependencies: - supports-color - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -3775,10 +3736,6 @@ snapshots: dependencies: minimatch: 5.1.6 - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3795,17 +3752,6 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@2.1.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -3832,8 +3778,6 @@ snapshots: fresh@0.5.2: {} - fresh@2.0.0: {} - fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 @@ -3922,10 +3866,6 @@ snapshots: has-symbols@1.1.0: {} - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -3946,18 +3886,16 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@3.1.0: + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 @@ -3975,10 +3913,6 @@ snapshots: is-arrayish@0.2.1: {} - is-core-module@2.13.1: - dependencies: - hasown: 2.0.0 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -3991,8 +3925,6 @@ snapshots: is-number@7.0.0: {} - is-promise@4.0.0: {} - is-stream@2.0.1: {} is-what@4.1.16: {} @@ -4001,23 +3933,13 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@5.2.1: + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.1: - dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -4027,15 +3949,15 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: - debug: 4.4.0 + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -4053,311 +3975,314 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jest-changed-files@29.7.0: + jest-changed-files@30.0.0: dependencies: execa: 5.1.1 - jest-util: 29.7.0 + jest-util: 30.0.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@30.0.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/environment': 30.0.0 + '@jest/expect': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.6.0 is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-each: 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-runtime: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 + pretty-format: 30.0.0 + pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.15.14): + jest-cli@30.0.0(@types/node@24.0.3): dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/core': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.14) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.15.14) - jest-util: 29.7.0 - jest-validate: 29.7.0 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.0(@types/node@24.0.3) + jest-util: 30.0.0 + jest-validate: 30.0.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jest-config@29.7.0(@types/node@22.15.14): + jest-config@30.0.0(@types/node@24.0.3): dependencies: - '@babel/core': 7.23.9 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.23.9) + '@babel/core': 7.27.4 + '@jest/get-type': 30.0.0 + '@jest/pattern': 30.0.0 + '@jest/test-sequencer': 30.0.0 + '@jest/types': 30.0.0 + babel-jest: 30.0.0(@babel/core@7.27.4) chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.2.0 deepmerge: 4.3.1 - glob: 7.2.3 + glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 + jest-circus: 30.0.0 + jest-docblock: 30.0.0 + jest-environment-node: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-runner: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 + micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 30.0.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.14 + '@types/node': 24.0.3 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@29.7.0: + jest-diff@30.0.0: dependencies: + '@jest/diff-sequences': 30.0.0 + '@jest/get-type': 30.0.0 chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + pretty-format: 30.0.0 - jest-docblock@29.7.0: + jest-docblock@30.0.0: dependencies: detect-newline: 3.1.0 - jest-each@29.7.0: + jest-each@30.0.0: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.0.0 + '@jest/types': 30.0.0 chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + jest-util: 30.0.0 + pretty-format: 30.0.0 - jest-environment-node@29.7.0: + jest-environment-node@30.0.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/environment': 30.0.0 + '@jest/fake-timers': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 + jest-mock: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: + jest-haste-map@30.0.0: dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.14 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + jest-worker: 30.0.0 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@29.7.0: + jest-leak-detector@30.0.0: dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + '@jest/get-type': 30.0.0 + pretty-format: 30.0.0 - jest-matcher-utils@29.7.0: + jest-matcher-utils@30.0.0: dependencies: + '@jest/get-type': 30.0.0 chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + jest-diff: 30.0.0 + pretty-format: 30.0.0 - jest-message-util@29.7.0: + jest-message-util@30.0.0: dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 29.6.3 + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 29.7.0 + pretty-format: 30.0.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.7.0: + jest-mock@30.0.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.14 - jest-util: 29.7.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 + jest-util: 30.0.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + jest-pnp-resolver@1.2.3(jest-resolve@30.0.0): optionalDependencies: - jest-resolve: 29.7.0 + jest-resolve: 30.0.0 - jest-regex-util@29.6.3: {} + jest-regex-util@30.0.0: {} - jest-resolve-dependencies@29.7.0: + jest-resolve-dependencies@30.0.0: dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: 30.0.0 + jest-snapshot: 30.0.0 transitivePeerDependencies: - supports-color - jest-resolve@29.7.0: + jest-resolve@30.0.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + jest-haste-map: 30.0.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0) + jest-util: 30.0.0 + jest-validate: 30.0.0 slash: 3.0.0 + unrs-resolver: 1.9.0 - jest-runner@29.7.0: + jest-runner@30.0.0: dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/console': 30.0.0 + '@jest/environment': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 chalk: 4.1.2 emittery: 0.13.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 + jest-docblock: 30.0.0 + jest-environment-node: 30.0.0 + jest-haste-map: 30.0.0 + jest-leak-detector: 30.0.0 + jest-message-util: 30.0.0 + jest-resolve: 30.0.0 + jest-runtime: 30.0.0 + jest-util: 30.0.0 + jest-watcher: 30.0.0 + jest-worker: 30.0.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + jest-runtime@30.0.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/environment': 30.0.0 + '@jest/fake-timers': 30.0.0 + '@jest/globals': 30.0.0 + '@jest/source-map': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 - glob: 7.2.3 + glob: 10.4.5 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-haste-map: 30.0.0 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0: + jest-snapshot@30.0.0: dependencies: - '@babel/core': 7.23.9 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) - '@babel/types': 7.23.9 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 + '@jest/expect-utils': 30.0.0 + '@jest/get-type': 30.0.0 + '@jest/snapshot-utils': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) chalk: 4.1.2 - expect: 29.7.0 + expect: 30.0.0 graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.6.2 + jest-diff: 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-util: 30.0.0 + pretty-format: 30.0.0 + semver: 7.7.2 + synckit: 0.11.8 transitivePeerDependencies: - supports-color - jest-util@29.7.0: + jest-util@30.0.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.2.0 graceful-fs: 4.2.11 - picomatch: 2.3.1 + picomatch: 4.0.2 - jest-validate@29.7.0: + jest-validate@30.0.0: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.0.0 + '@jest/types': 30.0.0 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.7.0 + pretty-format: 30.0.0 - jest-watcher@29.7.0: + jest-watcher@30.0.0: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.14 + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 24.0.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.7.0 + jest-util: 30.0.0 string-length: 4.0.2 - jest-worker@29.7.0: + jest-worker@30.0.0: dependencies: - '@types/node': 22.15.14 - jest-util: 29.7.0 + '@types/node': 24.0.3 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.15.14): + jest@30.0.0(@types/node@24.0.3): dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.15.14) + '@jest/core': 30.0.0 + '@jest/types': 30.0.0 + import-local: 3.2.0 + jest-cli: 30.0.0(@types/node@24.0.3) transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node @@ -4380,7 +4305,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -4402,9 +4327,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - - lemmy-js-client@1.0.0-post-tags.3: + lemmy-js-client@1.0.0-instance-user-blocking.8: dependencies: '@tsoa/runtime': 6.6.0 transitivePeerDependencies: @@ -4439,7 +4362,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -4451,27 +4374,18 @@ snapshots: media-typer@0.3.0: {} - media-typer@1.1.0: {} - merge-anything@5.1.7: dependencies: is-what: 4.1.16 merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} methods@1.1.2: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -4485,21 +4399,17 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - mime@1.6.0: {} mimic-fn@2.1.0: {} minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: @@ -4513,17 +4423,17 @@ snapshots: ms@2.1.3: {} + napi-postinstall@0.2.4: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} - negotiator@1.0.0: {} - neo-async@2.6.2: {} node-int64@0.4.0: {} - node-releases@2.0.14: {} + node-releases@2.0.19: {} normalize-path@3.0.0: {} @@ -4531,8 +4441,6 @@ snapshots: dependencies: path-key: 3.1.1 - object-assign@4.1.1: {} - object-inspect@1.13.4: {} on-finished@2.4.1: @@ -4582,7 +4490,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4595,8 +4503,6 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -4604,15 +4510,13 @@ snapshots: path-to-regexp@0.1.12: {} - path-to-regexp@8.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} - pirates@4.0.6: {} + picomatch@4.0.2: {} - pkce-challenge@5.0.0: {} + pirates@4.0.7: {} pkg-dir@4.2.0: dependencies: @@ -4626,17 +4530,12 @@ snapshots: prettier@3.5.3: {} - pretty-format@29.7.0: + pretty-format@30.0.0: dependencies: - '@jest/schemas': 29.6.3 + '@jest/schemas': 30.0.0 ansi-styles: 5.2.0 react-is: 18.3.1 - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4644,16 +4543,12 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.0.4: {} + pure-rand@7.0.1: {} qs@6.13.0: dependencies: side-channel: 1.1.0 - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -4665,13 +4560,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - react-is@18.3.1: {} reflect-metadata@0.2.2: {} @@ -4686,26 +4574,8 @@ snapshots: resolve-from@5.0.0: {} - resolve.exports@2.0.2: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - router@2.2.0: - dependencies: - debug: 4.4.0 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -4716,9 +4586,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} - - semver@7.7.1: {} + semver@7.7.2: {} send@0.19.0: dependencies: @@ -4738,22 +4606,6 @@ snapshots: transitivePeerDependencies: - supports-color - send@1.2.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -4763,15 +4615,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - setprototypeof@1.2.0: {} shebang-command@2.0.0: @@ -4812,8 +4655,6 @@ snapshots: signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - slash@3.0.0: {} source-map-support@0.5.13: @@ -4870,12 +4711,9 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.11.4: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 test-exclude@6.0.0: dependencies: @@ -4885,8 +4723,6 @@ snapshots: tmpl@1.0.5: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4899,27 +4735,28 @@ snapshots: ts-deepmerge@7.0.2: {} - ts-jest@29.3.2(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.15.14))(typescript@5.8.3): + ts-jest@29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.0)(@jest/types@30.0.0)(babel-jest@30.0.0(@babel/core@7.27.4))(jest-util@30.0.0)(jest@30.0.0(@types/node@24.0.3))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.14) - jest-util: 29.7.0 + jest: 30.0.0(@types/node@24.0.3) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 - type-fest: 4.40.1 + semver: 7.7.2 + type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.23.9 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.23.9) + '@babel/core': 7.27.4 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + babel-jest: 30.0.0(@babel/core@7.27.4) + jest-util: 30.0.0 - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tsoa@6.6.0: dependencies: @@ -4936,25 +4773,19 @@ snapshots: type-fest@0.21.3: {} - type-fest@4.40.1: {} + type-fest@4.41.0: {} type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - type-is@2.0.1: + typescript-eslint@8.34.1(eslint@9.29.0)(typescript@5.8.3): dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - - typescript-eslint@8.32.0(eslint@9.26.0)(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) - eslint: 9.26.0 + '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -4964,16 +4795,40 @@ snapshots: uglify-js@3.19.3: optional: true - undici-types@6.21.0: {} + undici-types@7.8.0: {} universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.22.3): + unrs-resolver@1.9.0: dependencies: - browserslist: 4.22.3 - escalade: 3.1.1 + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.9.0 + '@unrs/resolver-binding-android-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-x64': 1.9.0 + '@unrs/resolver-binding-freebsd-x64': 1.9.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.9.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-musl': 1.9.0 + '@unrs/resolver-binding-wasm32-wasi': 1.9.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.9.0 + + update-browserslist-db@1.1.3(browserslist@4.25.0): + dependencies: + browserslist: 4.25.0 + escalade: 3.2.0 picocolors: 1.1.1 uri-js@4.4.1: @@ -4982,9 +4837,9 @@ snapshots: utils-merge@1.0.1: {} - v8-to-istanbul@9.2.0: + v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -5018,10 +4873,10 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@4.0.2: + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 - signal-exit: 3.0.7 + signal-exit: 4.1.0 y18n@5.0.8: {} @@ -5042,9 +4897,3 @@ snapshots: yargs-parser: 21.1.1 yocto-queue@0.1.0: {} - - zod-to-json-schema@3.24.5(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod@3.24.4: {} diff --git a/api_tests/pnpm-workspace.yaml b/api_tests/pnpm-workspace.yaml new file mode 100644 index 000000000..d7265d292 --- /dev/null +++ b/api_tests/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +onlyBuiltDependencies: + - unrs-resolver diff --git a/api_tests/src/community.spec.ts b/api_tests/src/community.spec.ts index 4dad9bdd3..117acddbf 100644 --- a/api_tests/src/community.spec.ts +++ b/api_tests/src/community.spec.ts @@ -30,7 +30,7 @@ import { editCommunity, unfollows, getMyUser, - userBlockInstance, + userBlockInstanceCommunities, resolveBetaCommunity, reportCommunity, randomString, @@ -41,7 +41,6 @@ import { AdminAllowInstanceParams } from "lemmy-js-client/dist/types/AdminAllowI import { CommunityReport, CommunityReportView, - CommunityView, EditCommunity, FollowMultiCommunity, GetPosts, @@ -431,7 +430,11 @@ test("User blocks instance, communities are hidden", async () => { expect(listing_ids).toContain(postRes.post_view.post.ap_id); // block the beta instance - await userBlockInstance(alpha, alphaPost!.community.instance_id, true); + await userBlockInstanceCommunities( + alpha, + alphaPost!.community.instance_id, + true, + ); // after blocking, post should not be in listing let listing2 = await getPosts(alpha, "All"); @@ -439,7 +442,11 @@ test("User blocks instance, communities are hidden", async () => { expect(listing_ids2.indexOf(postRes.post_view.post.ap_id)).toBe(-1); // unblock instance again - await userBlockInstance(alpha, alphaPost!.community.instance_id, false); + await userBlockInstanceCommunities( + alpha, + alphaPost!.community.instance_id, + false, + ); // post should be included in listing let listing3 = await getPosts(alpha, "All"); diff --git a/api_tests/src/post.spec.ts b/api_tests/src/post.spec.ts index 3a0451810..cb7df832f 100644 --- a/api_tests/src/post.spec.ts +++ b/api_tests/src/post.spec.ts @@ -40,7 +40,6 @@ import { getMyUser, listNotifications, getModlog, - getCommunity, } from "./shared"; import { PostView } from "lemmy-js-client/dist/types/PostView"; import { AdminBlockInstanceParams } from "lemmy-js-client/dist/types/AdminBlockInstanceParams"; @@ -371,7 +370,11 @@ test("Delete a post", async () => { // Make sure lemmy beta sees post is deleted // This will be undefined because of the tombstone - await waitForPost(beta, postRes.post_view.post, p => !p || p.post.deleted); + await waitForPost( + beta, + postRes.post_view.post, + p => p?.post?.deleted || p == undefined, + ); // Undelete let undeletedPost = await deletePost(alpha, false, postRes.post_view.post); @@ -531,7 +534,7 @@ test("Enforce site ban federation for local user", async () => { // alpha ban should be federated to beta let alphaUserOnBeta1 = await waitUntil( () => resolvePerson(beta, alphaUserActorId!), - res => res?.creator_banned!, + res => res?.creator_banned == true, ); expect(alphaUserOnBeta1?.creator_banned).toBe(true); @@ -624,15 +627,6 @@ test("Enforce site ban federation for federated user", async () => { let alphaPerson2 = (await getMyUser(alphaUserHttp)).local_user_view; expect(alphaPerson2.banned).toBe(false); - // but the ban should be indicated by beta community on alpha - let communityWithBan = await getCommunity( - alphaUserHttp, - betaCommunity.community.id, - ); - expect( - communityWithBan.community_view.instance_actions?.received_ban_at, - ).toBeDefined(); - // post to beta community is rejected await expect( createPost(alphaUserHttp, betaCommunity.community.id), @@ -830,7 +824,7 @@ test("Report a post", async () => { () => listReports(beta).then(p => p.reports.find(r => { - return checkPostReportName(r, gammaReport) && r.resolver != null; + return checkPostReportName(r, gammaReport) && !!r.resolver; }), ), res => !!res, diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts index 085edad47..e3a7b71d5 100644 --- a/api_tests/src/shared.ts +++ b/api_tests/src/shared.ts @@ -20,18 +20,18 @@ import { PostView, PrivateMessageReportResponse, SuccessResponse, - UserBlockInstanceParams, ListPersonContentResponse, ListPersonContent, PersonContentType, - InboxDataType, GetModlogResponse, GetModlog, CommunityView, CommentView, PersonView, + UserBlockInstanceCommunitiesParams, ListNotifications, ListNotificationsResponse, + NotificationDataType, } from "lemmy-js-client"; import { CreatePost } from "lemmy-js-client/dist/types/CreatePost"; import { DeletePost } from "lemmy-js-client/dist/types/DeletePost"; @@ -386,7 +386,7 @@ export async function getUnreadCount( export async function listNotifications( api: LemmyHttp, - type_?: InboxDataType, + type_?: NotificationDataType, unread_only: boolean = false, ): Promise { let form: ListNotifications = { @@ -880,16 +880,16 @@ export function getPosts( return api.getPosts(form); } -export function userBlockInstance( +export function userBlockInstanceCommunities( api: LemmyHttp, instance_id: InstanceId, block: boolean, ): Promise { - let form: UserBlockInstanceParams = { + let form: UserBlockInstanceCommunitiesParams = { instance_id, block, }; - return api.userBlockInstance(form); + return api.userBlockInstanceCommunities(form); } export function blockCommunity( diff --git a/api_tests/src/tags.spec.ts b/api_tests/src/tags.spec.ts index c1d7cade1..edb1d6b2d 100644 --- a/api_tests/src/tags.spec.ts +++ b/api_tests/src/tags.spec.ts @@ -18,7 +18,7 @@ import { } from "./shared"; import { CreateCommunityTag } from "lemmy-js-client/dist/types/CreateCommunityTag"; import { DeleteCommunityTag } from "lemmy-js-client/dist/types/DeleteCommunityTag"; -import { AddModToCommunity, EditPost } from "lemmy-js-client"; +import { AddModToCommunity } from "lemmy-js-client"; beforeAll(setupLogins); afterAll(unfollows); diff --git a/api_tests/tsconfig.json b/api_tests/tsconfig.json index c580114ed..495dddc61 100644 --- a/api_tests/tsconfig.json +++ b/api_tests/tsconfig.json @@ -4,7 +4,7 @@ "declarationDir": "./dist", "module": "CommonJS", "noImplicitAny": true, - "lib": ["es2017", "es7", "es6", "dom"], + "lib": ["es2022", "es7", "es6", "dom"], "outDir": "./dist", "target": "ES2020", "strictNullChecks": true, diff --git a/crates/api/api/src/local_user/user_block_instance.rs b/crates/api/api/src/local_user/user_block_instance.rs index c753e18cd..7805818d5 100644 --- a/crates/api/api/src/local_user/user_block_instance.rs +++ b/crates/api/api/src/local_user/user_block_instance.rs @@ -1,16 +1,21 @@ use activitypub_federation::config::Data; use actix_web::web::Json; use lemmy_api_utils::context::LemmyContext; -use lemmy_db_schema::{ - source::instance::{InstanceActions, InstanceBlockForm}, - traits::Blockable, +use lemmy_db_schema::source::instance::{ + InstanceActions, + InstanceCommunitiesBlockForm, + InstancePersonsBlockForm, }; use lemmy_db_views_local_user::LocalUserView; -use lemmy_db_views_site::api::{SuccessResponse, UserBlockInstanceParams}; +use lemmy_db_views_site::api::{ + SuccessResponse, + UserBlockInstanceCommunitiesParams, + UserBlockInstancePersonsParams, +}; use lemmy_utils::error::{LemmyErrorType, LemmyResult}; -pub async fn user_block_instance( - data: Json, +pub async fn user_block_instance_communities( + data: Json, local_user_view: LocalUserView, context: Data, ) -> LemmyResult> { @@ -20,12 +25,34 @@ pub async fn user_block_instance( return Err(LemmyErrorType::CantBlockLocalInstance)?; } - let instance_block_form = InstanceBlockForm::new(person_id, instance_id); + let block_form = InstanceCommunitiesBlockForm::new(person_id, instance_id); if data.block { - InstanceActions::block(&mut context.pool(), &instance_block_form).await?; + InstanceActions::block_communities(&mut context.pool(), &block_form).await?; } else { - InstanceActions::unblock(&mut context.pool(), &instance_block_form).await?; + InstanceActions::unblock_communities(&mut context.pool(), &block_form).await?; + } + + Ok(Json(SuccessResponse::default())) +} + +pub async fn user_block_instance_persons( + data: Json, + local_user_view: LocalUserView, + context: Data, +) -> LemmyResult> { + let instance_id = data.instance_id; + let person_id = local_user_view.person.id; + if local_user_view.person.instance_id == instance_id { + return Err(LemmyErrorType::CantBlockLocalInstance)?; + } + + let block_form = InstancePersonsBlockForm::new(person_id, instance_id); + + if data.block { + InstanceActions::block_persons(&mut context.pool(), &block_form).await?; + } else { + InstanceActions::unblock_persons(&mut context.pool(), &block_form).await?; } Ok(Json(SuccessResponse::default())) diff --git a/crates/api/api_common/src/federation.rs b/crates/api/api_common/src/federation.rs index 4dd2f9d26..17655a6d8 100644 --- a/crates/api/api_common/src/federation.rs +++ b/crates/api/api_common/src/federation.rs @@ -14,7 +14,8 @@ pub use lemmy_db_views_site::api::{ GetFederatedInstancesResponse, InstanceWithFederationState, ResolveObject, - UserBlockInstanceParams, + UserBlockInstanceCommunitiesParams, + UserBlockInstancePersonsParams, }; pub mod administration { diff --git a/crates/api/api_crud/src/user/my_user.rs b/crates/api/api_crud/src/user/my_user.rs index 4f29ec407..8e413b6c5 100644 --- a/crates/api/api_crud/src/user/my_user.rs +++ b/crates/api/api_crud/src/user/my_user.rs @@ -30,7 +30,8 @@ pub async fn get_my_user( let ( follows, community_blocks, - instance_blocks, + instance_communities_blocks, + instance_persons_blocks, person_blocks, moderates, keyword_blocks, @@ -38,7 +39,8 @@ pub async fn get_my_user( ) = lemmy_db_schema::try_join_with_pool!(pool => ( |pool| CommunityFollowerView::for_person(pool, person_id), |pool| CommunityActions::read_blocks_for_person(pool, person_id), - |pool| InstanceActions::read_blocks_for_person(pool, person_id), + |pool| InstanceActions::read_communities_block_for_person(pool, person_id), + |pool| InstanceActions::read_persons_block_for_person(pool, person_id), |pool| PersonActions::read_blocks_for_person(pool, person_id), |pool| CommunityModeratorView::for_person(pool, person_id, Some(&local_user_view.local_user)), |pool| LocalUserKeywordBlock::read(pool, local_user_id), @@ -50,7 +52,8 @@ pub async fn get_my_user( follows, moderates, community_blocks, - instance_blocks, + instance_communities_blocks, + instance_persons_blocks, person_blocks, keyword_blocks, discussion_languages, diff --git a/crates/api/api_utils/src/notify.rs b/crates/api/api_utils/src/notify.rs index 33c15239b..ac458e5ec 100644 --- a/crates/api/api_utils/src/notify.rs +++ b/crates/api/api_utils/src/notify.rs @@ -102,7 +102,10 @@ impl NotifyData { let pool = &mut context.pool(); // TODO: this needs too many queries for each user PersonActions::read_block(pool, potential_blocker_id, self.post.creator_id).await?; - InstanceActions::read_block(pool, potential_blocker_id, self.community.instance_id).await?; + InstanceActions::read_communities_block(pool, potential_blocker_id, self.community.instance_id) + .await?; + InstanceActions::read_persons_block(pool, potential_blocker_id, self.creator.instance_id) + .await?; CommunityActions::read_block(pool, potential_blocker_id, self.post.community_id).await?; let post_notifications = PostActions::read(pool, self.post.id, potential_blocker_id) .await @@ -284,7 +287,7 @@ mod tests { source::{ comment::{Comment, CommentInsertForm}, community::{Community, CommunityInsertForm}, - instance::{Instance, InstanceActions, InstanceBlockForm}, + instance::{Instance, InstanceActions, InstancePersonsBlockForm}, notification::{Notification, NotificationInsertForm}, person::{Person, PersonActions, PersonBlockForm, PersonInsertForm, PersonUpdateForm}, post::{Post, PostInsertForm}, @@ -716,16 +719,19 @@ mod tests { // Make sure instance_blocks are working let timmy_blocks_instance_form = - InstanceBlockForm::new(data.timmy.person.id, data.sara.person.instance_id); + InstancePersonsBlockForm::new(data.timmy.person.id, data.sara.person.instance_id); - let inserted_instance_block = InstanceActions::block(pool, &timmy_blocks_instance_form).await?; + let inserted_instance_block = + InstanceActions::block_persons(pool, &timmy_blocks_instance_form).await?; - assert_eq!(data.timmy.person.id, inserted_instance_block.person_id); assert_eq!( - data.sara.person.instance_id, - inserted_instance_block.instance_id + (data.timmy.person.id, data.sara.person.instance_id, true), + ( + inserted_instance_block.person_id, + inserted_instance_block.instance_id, + inserted_instance_block.blocked_persons_at.is_some() + ) ); - assert!(inserted_instance_block.blocked_at.is_some()); let timmy_messages: Vec<_> = NotificationQuery { unread_only: Some(true), diff --git a/crates/apub/src/api/user_settings_backup.rs b/crates/apub/src/api/user_settings_backup.rs index 8f1d8319f..e6bed6818 100644 --- a/crates/apub/src/api/user_settings_backup.rs +++ b/crates/apub/src/api/user_settings_backup.rs @@ -13,7 +13,7 @@ use lemmy_db_schema::{ source::{ comment::{CommentActions, CommentSavedForm}, community::{CommunityActions, CommunityBlockForm, CommunityFollowerForm}, - instance::{Instance, InstanceActions, InstanceBlockForm}, + instance::{Instance, InstanceActions, InstanceCommunitiesBlockForm, InstancePersonsBlockForm}, local_user::{LocalUser, LocalUserUpdateForm}, person::{Person, PersonActions, PersonBlockForm, PersonUpdateForm}, post::{PostActions, PostSavedForm}, @@ -98,7 +98,8 @@ pub async fn import_settings( let url_count = data.followed_communities.len() + data.blocked_communities.len() + data.blocked_users.len() - + data.blocked_instances.len() + + data.blocked_instances_communities.len() + + data.blocked_instances_persons.len() + data.saved_posts.len() + data.saved_comments.len(); check_api_elements_count(url_count)?; @@ -197,10 +198,23 @@ pub async fn import_settings( ) .await?; - try_join_all(data.blocked_instances.iter().map(|domain| async { + try_join_all( + data + .blocked_instances_communities + .iter() + .map(|domain| async { + let instance = Instance::read_or_create(&mut context.pool(), domain.clone()).await?; + let form = InstanceCommunitiesBlockForm::new(person_id, instance.id); + InstanceActions::block_communities(&mut context.pool(), &form).await?; + LemmyResult::Ok(()) + }), + ) + .await?; + + try_join_all(data.blocked_instances_persons.iter().map(|domain| async { let instance = Instance::read_or_create(&mut context.pool(), domain.clone()).await?; - let form = InstanceBlockForm::new(person_id, instance.id); - InstanceActions::block(&mut context.pool(), &form).await?; + let form = InstancePersonsBlockForm::new(person_id, instance.id); + InstanceActions::block_persons(&mut context.pool(), &form).await?; LemmyResult::Ok(()) })) .await?; diff --git a/crates/db_schema/src/impls/instance.rs b/crates/db_schema/src/impls/instance.rs index 011eac052..fdf1580de 100644 --- a/crates/db_schema/src/impls/instance.rs +++ b/crates/db_schema/src/impls/instance.rs @@ -3,9 +3,16 @@ use crate::{ newtypes::{InstanceId, PersonId}, source::{ federation_queue_state::FederationQueueState, - instance::{Instance, InstanceActions, InstanceBanForm, InstanceBlockForm, InstanceForm}, + instance::{ + Instance, + InstanceActions, + InstanceBanForm, + InstanceCommunitiesBlockForm, + InstanceForm, + InstancePersonsBlockForm, + }, }, - traits::{Bannable, Blockable}, + traits::Bannable, utils::{ functions::{coalesce, lower}, get_conn, @@ -206,12 +213,11 @@ impl Instance { } } -impl Blockable for InstanceActions { - type Form = InstanceBlockForm; - type ObjectIdType = InstanceId; - type ObjectType = Instance; - - async fn block(pool: &mut DbPool<'_>, form: &Self::Form) -> LemmyResult { +impl InstanceActions { + pub async fn block_communities( + pool: &mut DbPool<'_>, + form: &InstanceCommunitiesBlockForm, + ) -> LemmyResult { let conn = &mut get_conn(pool).await?; insert_into(instance_actions::table) .values(form) @@ -221,27 +227,31 @@ impl Blockable for InstanceActions { .returning(Self::as_select()) .get_result::(conn) .await - .with_lemmy_type(LemmyErrorType::InstanceBlockAlreadyExists) + .with_lemmy_type(LemmyErrorType::InstanceBlockCommunitiesAlreadyExists) } - async fn unblock(pool: &mut DbPool<'_>, form: &Self::Form) -> LemmyResult { + pub async fn unblock_communities( + pool: &mut DbPool<'_>, + form: &InstanceCommunitiesBlockForm, + ) -> LemmyResult { let conn = &mut get_conn(pool).await?; uplete(instance_actions::table.find((form.person_id, form.instance_id))) - .set_null(instance_actions::blocked_at) + .set_null(instance_actions::blocked_communities_at) .get_result(conn) .await - .with_lemmy_type(LemmyErrorType::InstanceBlockAlreadyExists) + .with_lemmy_type(LemmyErrorType::InstanceBlockCommunitiesAlreadyExists) } - async fn read_block( + /// Checks to see if there's a block for the instances communities + pub async fn read_communities_block( pool: &mut DbPool<'_>, person_id: PersonId, - instance_id: Self::ObjectIdType, + instance_id: InstanceId, ) -> LemmyResult<()> { let conn = &mut get_conn(pool).await?; let find_action = instance_actions::table .find((person_id, instance_id)) - .filter(instance_actions::blocked_at.is_not_null()); + .filter(instance_actions::blocked_communities_at.is_not_null()); select(not(exists(find_action))) .get_result::(conn) .await? @@ -249,24 +259,83 @@ impl Blockable for InstanceActions { .ok_or(LemmyErrorType::InstanceIsBlocked.into()) } - async fn read_blocks_for_person( + pub async fn read_communities_block_for_person( pool: &mut DbPool<'_>, person_id: PersonId, - ) -> LemmyResult> { + ) -> LemmyResult> { let conn = &mut get_conn(pool).await?; instance_actions::table - .filter(instance_actions::blocked_at.is_not_null()) + .filter(instance_actions::blocked_communities_at.is_not_null()) .inner_join(instance::table) .select(instance::all_columns) .filter(instance_actions::person_id.eq(person_id)) - .order_by(instance_actions::blocked_at) + .order_by(instance_actions::blocked_communities_at) + .load::(conn) + .await + .with_lemmy_type(LemmyErrorType::NotFound) + } + + pub async fn block_persons( + pool: &mut DbPool<'_>, + form: &InstancePersonsBlockForm, + ) -> LemmyResult { + let conn = &mut get_conn(pool).await?; + insert_into(instance_actions::table) + .values(form) + .on_conflict((instance_actions::person_id, instance_actions::instance_id)) + .do_update() + .set(form) + .returning(Self::as_select()) + .get_result::(conn) + .await + .with_lemmy_type(LemmyErrorType::InstanceBlockPersonsAlreadyExists) + } + + pub async fn unblock_persons( + pool: &mut DbPool<'_>, + form: &InstancePersonsBlockForm, + ) -> LemmyResult { + let conn = &mut get_conn(pool).await?; + uplete(instance_actions::table.find((form.person_id, form.instance_id))) + .set_null(instance_actions::blocked_persons_at) + .get_result(conn) + .await + .with_lemmy_type(LemmyErrorType::InstanceBlockPersonsAlreadyExists) + } + + /// Checks to see if there's a block either from the instance person. + pub async fn read_persons_block( + pool: &mut DbPool<'_>, + person_id: PersonId, + instance_id: InstanceId, + ) -> LemmyResult<()> { + let conn = &mut get_conn(pool).await?; + let find_action = instance_actions::table + .find((person_id, instance_id)) + .filter(instance_actions::blocked_persons_at.is_not_null()); + select(not(exists(find_action))) + .get_result::(conn) + .await? + .then_some(()) + .ok_or(LemmyErrorType::InstanceIsBlocked.into()) + } + + pub async fn read_persons_block_for_person( + pool: &mut DbPool<'_>, + person_id: PersonId, + ) -> LemmyResult> { + let conn = &mut get_conn(pool).await?; + instance_actions::table + .filter(instance_actions::blocked_persons_at.is_not_null()) + .inner_join(instance::table) + .select(instance::all_columns) + .filter(instance_actions::person_id.eq(person_id)) + .order_by(instance_actions::blocked_persons_at) .load::(conn) .await .with_lemmy_type(LemmyErrorType::NotFound) } -} -impl InstanceActions { pub async fn check_ban( pool: &mut DbPool<'_>, person_id: PersonId, diff --git a/crates/db_schema/src/impls/local_user.rs b/crates/db_schema/src/impls/local_user.rs index ec45f2c7f..1a24bf1dd 100644 --- a/crates/db_schema/src/impls/local_user.rs +++ b/crates/db_schema/src/impls/local_user.rs @@ -211,8 +211,16 @@ impl LocalUser { .get_results(conn) .await?; - let blocked_instances = instance_actions::table - .filter(instance_actions::blocked_at.is_not_null()) + let blocked_instances_communities = instance_actions::table + .filter(instance_actions::blocked_communities_at.is_not_null()) + .filter(instance_actions::person_id.eq(person_id_)) + .inner_join(instance::table) + .select(instance::domain) + .get_results(conn) + .await?; + + let blocked_instances_persons = instance_actions::table + .filter(instance_actions::blocked_persons_at.is_not_null()) .filter(instance_actions::person_id.eq(person_id_)) .inner_join(instance::table) .select(instance::domain) @@ -227,7 +235,8 @@ impl LocalUser { saved_comments, blocked_communities, blocked_users, - blocked_instances, + blocked_instances_communities, + blocked_instances_persons, }) } @@ -382,7 +391,8 @@ pub struct UserBackupLists { pub saved_comments: Vec, pub blocked_communities: Vec, pub blocked_users: Vec, - pub blocked_instances: Vec, + pub blocked_instances_communities: Vec, + pub blocked_instances_persons: Vec, } #[cfg(test)] diff --git a/crates/db_schema/src/impls/post.rs b/crates/db_schema/src/impls/post.rs index f9869972d..e96d90b2e 100644 --- a/crates/db_schema/src/impls/post.rs +++ b/crates/db_schema/src/impls/post.rs @@ -542,7 +542,7 @@ impl PostActions { pub fn build_many_read_forms(post_ids: &[PostId], person_id: PersonId) -> Vec { post_ids .iter() - .map(|post_id| (PostReadForm::new(*post_id, person_id))) + .map(|post_id| PostReadForm::new(*post_id, person_id)) .collect::>() } diff --git a/crates/db_schema/src/lib.rs b/crates/db_schema/src/lib.rs index 7a2eb435c..6070ec9d1 100644 --- a/crates/db_schema/src/lib.rs +++ b/crates/db_schema/src/lib.rs @@ -19,6 +19,7 @@ pub mod aliases { instance_actions as creator_home_instance_actions: CreatorHomeInstanceActions, instance_actions as creator_community_instance_actions: CreatorCommunityInstanceActions, instance_actions as creator_local_instance_actions: CreatorLocalInstanceActions, + instance_actions as my_instance_persons_actions: MyInstancePersonsActions, local_user as creator_local_user: CreatorLocalUser, person as person1: Person1, person as person2: Person2, @@ -33,7 +34,10 @@ pub mod utils; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; #[cfg(feature = "full")] -use {diesel::query_source::AliasedField, lemmy_db_schema_file::schema::person}; +use { + diesel::query_source::AliasedField, + lemmy_db_schema_file::schema::{instance_actions, person}, +}; #[derive( EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default, Hash, @@ -233,3 +237,14 @@ pub type Person2AliasAllColumnsTuple = ( AliasedField, AliasedField, ); + +#[cfg(feature = "full")] +/// A helper tuple for more my instance persons actions +pub type MyInstancePersonsActionsAllColumnsTuple = ( + AliasedField, + AliasedField, + AliasedField, + AliasedField, + AliasedField, + AliasedField, +); diff --git a/crates/db_schema/src/source/instance.rs b/crates/db_schema/src/source/instance.rs index 89d73b1ad..6374007ea 100644 --- a/crates/db_schema/src/source/instance.rs +++ b/crates/db_schema/src/source/instance.rs @@ -59,22 +59,34 @@ pub struct InstanceActions { pub person_id: PersonId, #[serde(skip)] pub instance_id: InstanceId, - /// When the instance was blocked. - pub blocked_at: Option>, + /// When the instance's communities were blocked. + pub blocked_communities_at: Option>, /// When this user received a site ban. pub received_ban_at: Option>, /// When their ban expires. pub ban_expires_at: Option>, + /// When the instance's persons were blocked. + pub blocked_persons_at: Option>, } #[derive(derive_new::new)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = instance_actions))] -pub struct InstanceBlockForm { +pub struct InstanceCommunitiesBlockForm { pub person_id: PersonId, pub instance_id: InstanceId, #[new(value = "Utc::now()")] - pub blocked_at: DateTime, + pub blocked_communities_at: DateTime, +} + +#[derive(derive_new::new)] +#[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] +#[cfg_attr(feature = "full", diesel(table_name = instance_actions))] +pub struct InstancePersonsBlockForm { + pub person_id: PersonId, + pub instance_id: InstanceId, + #[new(value = "Utc::now()")] + pub blocked_persons_at: DateTime, } #[derive(derive_new::new)] diff --git a/crates/db_schema/src/utils/queries.rs b/crates/db_schema/src/utils/queries.rs index 1c3aebc82..89f041f46 100644 --- a/crates/db_schema/src/utils/queries.rs +++ b/crates/db_schema/src/utils/queries.rs @@ -5,17 +5,19 @@ use crate::{ creator_home_instance_actions, creator_local_instance_actions, creator_local_user, + my_instance_persons_actions, person1, person2, }, newtypes::{InstanceId, PersonId}, + MyInstancePersonsActionsAllColumnsTuple, Person1AliasAllColumnsTuple, Person2AliasAllColumnsTuple, }; use diesel::{ dsl::{case_when, exists, not}, expression::SqlLiteral, - helper_types::{Eq, NotEq}, + helper_types::{Eq, NotEq, Nullable}, sql_types::Json, BoolExpressionMethods, ExpressionMethods, @@ -50,11 +52,16 @@ use lemmy_db_schema_file::{ /// hidden, unless the user followed the community explicitly. #[diesel::dsl::auto_type] pub fn filter_blocked() -> _ { - instance_actions::blocked_at + instance_actions::blocked_communities_at .is_null() .or(community_actions::followed_at.is_not_null()) .and(community_actions::blocked_at.is_null()) .and(person_actions::blocked_at.is_null()) + .and( + my_instance_persons_actions + .field(instance_actions::blocked_persons_at) + .is_null(), + ) } /// Checks that the creator_local_user is an admin. @@ -336,7 +343,7 @@ pub fn creator_local_instance_actions_join(local_instance_id: InstanceId) -> _ { /// Your instance actions for the community's instance. #[diesel::dsl::auto_type] -pub fn my_instance_actions_community_join(my_person_id: Option) -> _ { +pub fn my_instance_communities_actions_join(my_person_id: Option) -> _ { instance_actions::table.on( instance_actions::instance_id .eq(community::instance_id) @@ -346,7 +353,7 @@ pub fn my_instance_actions_community_join(my_person_id: Option) -> _ { /// Your instance actions for the person's instance. #[diesel::dsl::auto_type] -pub fn my_instance_actions_person_join(my_person_id: Option) -> _ { +pub fn my_instance_persons_actions_join(my_person_id: Option) -> _ { instance_actions::table.on( instance_actions::instance_id .eq(person::instance_id) @@ -354,6 +361,29 @@ pub fn my_instance_actions_person_join(my_person_id: Option) -> _ { ) } +/// The select for the my_instance_persons_actions alias +pub fn my_instance_persons_actions_select() -> Nullable { + my_instance_persons_actions + .fields(instance_actions::all_columns) + .nullable() +} + +/// Your instance actions for the person's instance. +/// A dupe of the above function, but aliased +#[diesel::dsl::auto_type] +pub fn my_instance_persons_actions_join_1(my_person_id: Option) -> _ { + my_instance_persons_actions.on( + my_instance_persons_actions + .field(instance_actions::instance_id) + .eq(person::instance_id) + .and( + my_instance_persons_actions + .field(instance_actions::person_id) + .nullable() + .eq(my_person_id), + ), + ) +} #[diesel::dsl::auto_type] pub fn image_details_join() -> _ { image_details::table.on(post::thumbnail_url.eq(image_details::link.nullable())) diff --git a/crates/db_schema_file/src/schema.rs b/crates/db_schema_file/src/schema.rs index 65b66f52e..cf3fe03a0 100644 --- a/crates/db_schema_file/src/schema.rs +++ b/crates/db_schema_file/src/schema.rs @@ -411,9 +411,10 @@ diesel::table! { instance_actions (person_id, instance_id) { person_id -> Int4, instance_id -> Int4, - blocked_at -> Nullable, + blocked_communities_at -> Nullable, received_ban_at -> Nullable, ban_expires_at -> Nullable, + blocked_persons_at -> Nullable, } } diff --git a/crates/db_views/comment/src/impls.rs b/crates/db_views/comment/src/impls.rs index fa9091794..1de06b1a8 100644 --- a/crates/db_views/comment/src/impls.rs +++ b/crates/db_views/comment/src/impls.rs @@ -33,7 +33,8 @@ use lemmy_db_schema::{ filter_blocked, my_comment_actions_join, my_community_actions_join, - my_instance_actions_community_join, + my_instance_communities_actions_join, + my_instance_persons_actions_join_1, my_local_user_admin_join, my_person_actions_join, suggested_communities, @@ -78,8 +79,10 @@ impl CommentView { my_community_actions_join(my_person_id); let my_comment_actions_join: my_comment_actions_join = my_comment_actions_join(my_person_id); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(my_person_id); - let my_instance_actions_community_join: my_instance_actions_community_join = - my_instance_actions_community_join(my_person_id); + let my_instance_communities_actions_join: my_instance_communities_actions_join = + my_instance_communities_actions_join(my_person_id); + let my_instance_persons_actions_join_1: my_instance_persons_actions_join_1 = + my_instance_persons_actions_join_1(my_person_id); let my_person_actions_join: my_person_actions_join = my_person_actions_join(my_person_id); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -88,15 +91,16 @@ impl CommentView { .inner_join(person::table) .inner_join(post::table) .inner_join(community_join) + .left_join(creator_home_instance_actions_join()) + .left_join(creator_community_instance_actions_join()) + .left_join(creator_community_actions_join()) + .left_join(creator_local_instance_actions_join) .left_join(my_community_actions_join) .left_join(my_comment_actions_join) .left_join(my_person_actions_join) .left_join(my_local_user_admin_join) - .left_join(my_instance_actions_community_join) - .left_join(creator_home_instance_actions_join()) - .left_join(creator_community_instance_actions_join()) - .left_join(creator_local_instance_actions_join) - .left_join(creator_community_actions_join()) + .left_join(my_instance_communities_actions_join) + .left_join(my_instance_persons_actions_join_1) } pub async fn read( @@ -138,7 +142,6 @@ impl CommentView { creator: self.creator, comment_actions: self.comment_actions, person_actions: self.person_actions, - instance_actions: self.instance_actions, creator_is_admin: self.creator_is_admin, can_mod: self.can_mod, creator_banned: self.creator_banned, diff --git a/crates/db_views/comment/src/lib.rs b/crates/db_views/comment/src/lib.rs index a0abcee12..db14c02e9 100644 --- a/crates/db_views/comment/src/lib.rs +++ b/crates/db_views/comment/src/lib.rs @@ -1,7 +1,6 @@ use lemmy_db_schema::source::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, - instance::InstanceActions, person::{Person, PersonActions}, post::Post, tag::TagsView, @@ -14,13 +13,11 @@ use { lemmy_db_schema::utils::queries::{ comment_creator_is_admin, comment_select_remove_deletes, - local_user_can_mod_comment, - post_tags_fragment, - }, - lemmy_db_schema::utils::queries::{ creator_banned_from_community, creator_banned_within_community, creator_is_moderator, + local_user_can_mod_comment, + post_tags_fragment, }, }; @@ -54,8 +51,6 @@ pub struct CommentView { pub comment_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub person_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, #[cfg_attr(feature = "full", diesel( select_expression = comment_creator_is_admin() @@ -106,7 +101,6 @@ pub struct CommentSlimView { pub creator: Person, pub comment_actions: Option, pub person_actions: Option, - pub instance_actions: Option, pub creator_is_admin: bool, pub can_mod: bool, pub creator_banned: bool, diff --git a/crates/db_views/community/src/impls.rs b/crates/db_views/community/src/impls.rs index 18ac69410..0d0af4482 100644 --- a/crates/db_views/community/src/impls.rs +++ b/crates/db_views/community/src/impls.rs @@ -20,7 +20,7 @@ use lemmy_db_schema::{ filter_is_subscribed, filter_not_unlisted_or_is_subscribed, my_community_actions_join, - my_instance_actions_community_join, + my_instance_communities_actions_join, my_local_user_admin_join, suggested_communities, }, @@ -48,8 +48,8 @@ impl CommunityView { #[diesel::dsl::auto_type(no_type_alias)] fn joins(person_id: Option) -> _ { let community_actions_join: my_community_actions_join = my_community_actions_join(person_id); - let instance_actions_community_join: my_instance_actions_community_join = - my_instance_actions_community_join(person_id); + let instance_actions_community_join: my_instance_communities_actions_join = + my_instance_communities_actions_join(person_id); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(person_id); community::table @@ -150,7 +150,7 @@ impl CommunityQuery<'_> { // Don't show blocked communities and communities on blocked instances. nsfw communities are // also hidden (based on profile setting) - query = query.filter(instance_actions::blocked_at.is_null()); + query = query.filter(instance_actions::blocked_communities_at.is_null()); query = query.filter(community_actions::blocked_at.is_null()); if !(o.local_user.show_nsfw(site) || o.show_nsfw.unwrap_or_default()) { query = query.filter(community::nsfw.eq(false)); diff --git a/crates/db_views/community/src/lib.rs b/crates/db_views/community/src/lib.rs index 344bdad7a..c73b63970 100644 --- a/crates/db_views/community/src/lib.rs +++ b/crates/db_views/community/src/lib.rs @@ -1,6 +1,5 @@ use lemmy_db_schema::source::{ community::{Community, CommunityActions}, - instance::InstanceActions, multi_community::MultiCommunity, person::Person, tag::TagsView, @@ -29,8 +28,6 @@ pub struct CommunityView { pub community: Community, #[cfg_attr(feature = "full", diesel(embed))] pub community_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, #[cfg_attr(feature = "full", diesel( select_expression = local_user_community_can_mod() diff --git a/crates/db_views/notification/src/impls.rs b/crates/db_views/notification/src/impls.rs index 9884c1f00..1fab10bc3 100644 --- a/crates/db_views/notification/src/impls.rs +++ b/crates/db_views/notification/src/impls.rs @@ -28,10 +28,12 @@ use lemmy_db_schema::{ creator_home_instance_actions_join, creator_local_instance_actions_join, creator_local_user_admin_join, + filter_blocked, image_details_join, my_comment_actions_join, my_community_actions_join, - my_instance_actions_person_join, + my_instance_communities_actions_join, + my_instance_persons_actions_join_1, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -42,15 +44,7 @@ use lemmy_db_schema::{ }; use lemmy_db_schema_file::{ enums::NotificationTypes, - schema::{ - comment, - instance_actions, - notification, - person, - person_actions, - post, - private_message, - }, + schema::{comment, notification, person, post, private_message}, }; use lemmy_db_views_post::PostView; use lemmy_db_views_private_message::PrivateMessageView; @@ -107,8 +101,10 @@ impl NotificationView { my_comment_actions_join(Some(my_person.id)); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(Some(my_person.id)); - let my_instance_actions_person_join: my_instance_actions_person_join = - my_instance_actions_person_join(Some(my_person.id)); + let my_instance_communities_actions_join: my_instance_communities_actions_join = + my_instance_communities_actions_join(Some(my_person.id)); + let my_instance_persons_actions_join_1: my_instance_persons_actions_join_1 = + my_instance_persons_actions_join_1(Some(my_person.id)); let my_person_actions_join: my_person_actions_join = my_person_actions_join(Some(my_person.id)); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(my_person.instance_id); @@ -122,12 +118,13 @@ impl NotificationView { .inner_join(recipient_join) .left_join(image_details_join()) .left_join(creator_community_actions_join()) - .left_join(my_local_user_admin_join) .left_join(creator_local_user_admin_join()) - .left_join(my_community_actions_join) - .left_join(my_instance_actions_person_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_local_instance_actions_join) + .left_join(my_local_user_admin_join) + .left_join(my_community_actions_join) + .left_join(my_instance_communities_actions_join) + .left_join(my_instance_persons_actions_join_1) .left_join(my_post_actions_join) .left_join(my_person_actions_join) .left_join(my_comment_actions_join) @@ -150,8 +147,7 @@ impl NotificationView { // Filter unreads .filter(unread_filter) // Don't count replies from blocked users - .filter(person_actions::blocked_at.is_null()) - .filter(instance_actions::blocked_at.is_null()) + .filter(filter_blocked()) .select(count(notification::id)) .into_boxed(); @@ -242,9 +238,7 @@ impl NotificationQuery { }; // Dont show replies from blocked users or instances - query = query - .filter(person_actions::blocked_at.is_null()) - .filter(instance_actions::blocked_at.is_null()); + query = query.filter(filter_blocked()); if let Some(type_) = self.type_ { query = match type_ { @@ -294,7 +288,6 @@ fn map_to_enum(v: NotificationViewInternal) -> Option { community, creator: v.creator, community_actions: v.community_actions, - instance_actions: v.instance_actions, person_actions: v.person_actions, comment_actions: v.comment_actions, creator_is_admin: v.creator_is_admin, @@ -311,7 +304,6 @@ fn map_to_enum(v: NotificationViewInternal) -> Option { creator: v.creator, image_details: v.image_details, community_actions: v.community_actions, - instance_actions: v.instance_actions, post_actions: v.post_actions, person_actions: v.person_actions, creator_is_admin: v.creator_is_admin, diff --git a/crates/db_views/notification/src/lib.rs b/crates/db_views/notification/src/lib.rs index 4a9eddb33..1b27a5ee1 100644 --- a/crates/db_views/notification/src/lib.rs +++ b/crates/db_views/notification/src/lib.rs @@ -4,7 +4,6 @@ use lemmy_db_schema::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, notification::Notification, person::{Person, PersonActions}, post::{Post, PostActions}, @@ -22,9 +21,15 @@ use serde_with::skip_serializing_none; use { diesel::{Queryable, Selectable}, lemmy_db_schema::{ - utils::queries::person1_select, - utils::queries::{creator_banned, creator_is_admin, local_user_can_mod, post_tags_fragment}, - utils::queries::{creator_banned_from_community, creator_is_moderator}, + utils::queries::{ + creator_banned, + creator_banned_from_community, + creator_is_admin, + creator_is_moderator, + local_user_can_mod, + person1_select, + post_tags_fragment, + }, Person1AliasAllColumnsTuple, }, }; @@ -61,8 +66,6 @@ struct NotificationViewInternal { #[cfg_attr(feature = "full", diesel(embed))] community_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] - instance_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] post_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] person_actions: Option, diff --git a/crates/db_views/person_content_combined/src/impls.rs b/crates/db_views/person_content_combined/src/impls.rs index 1ab7ddec1..130210880 100644 --- a/crates/db_views/person_content_combined/src/impls.rs +++ b/crates/db_views/person_content_combined/src/impls.rs @@ -33,7 +33,6 @@ use lemmy_db_schema::{ image_details_join, my_comment_actions_join, my_community_actions_join, - my_instance_actions_person_join, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -76,8 +75,6 @@ impl PersonContentCombinedViewInternal { let my_post_actions_join: my_post_actions_join = my_post_actions_join(my_person_id); let my_comment_actions_join: my_comment_actions_join = my_comment_actions_join(my_person_id); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(my_person_id); - let my_instance_actions_person_join: my_instance_actions_person_join = - my_instance_actions_person_join(my_person_id); let my_person_actions_join: my_person_actions_join = my_person_actions_join(my_person_id); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -87,17 +84,16 @@ impl PersonContentCombinedViewInternal { .inner_join(post_join) .inner_join(item_creator_join) .inner_join(community_join()) + .left_join(image_details_join()) .left_join(creator_community_actions_join()) - .left_join(my_local_user_admin_join) .left_join(creator_local_user_admin_join()) - .left_join(my_community_actions_join) - .left_join(my_instance_actions_person_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_local_instance_actions_join) + .left_join(my_local_user_admin_join) + .left_join(my_community_actions_join) .left_join(my_post_actions_join) .left_join(my_person_actions_join) .left_join(my_comment_actions_join) - .left_join(image_details_join()) } } @@ -240,7 +236,6 @@ impl InternalToCombinedView for PersonContentCombinedViewInternal { community_actions: v.community_actions, comment_actions: v.comment_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, post_tags: v.post_tags, can_mod: v.can_mod, @@ -257,7 +252,6 @@ impl InternalToCombinedView for PersonContentCombinedViewInternal { community_actions: v.community_actions, post_actions: v.post_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, tags: v.post_tags, can_mod: v.can_mod, diff --git a/crates/db_views/person_content_combined/src/lib.rs b/crates/db_views/person_content_combined/src/lib.rs index d13973366..6e58dc6e3 100644 --- a/crates/db_views/person_content_combined/src/lib.rs +++ b/crates/db_views/person_content_combined/src/lib.rs @@ -5,7 +5,6 @@ use lemmy_db_schema::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, person::{Person, PersonActions}, post::{Post, PostActions}, tag::TagsView, @@ -21,11 +20,13 @@ use { diesel::{Queryable, Selectable}, lemmy_db_schema::utils::queries::{ creator_banned, + creator_banned_from_community, creator_is_admin, + creator_is_moderator, local_user_can_mod, post_tags_fragment, }, - lemmy_db_schema::utils::queries::{creator_banned_from_community, creator_is_moderator}, + lemmy_db_views_local_user::LocalUserView, }; @@ -50,8 +51,6 @@ pub(crate) struct PersonContentCombinedViewInternal { #[cfg_attr(feature = "full", diesel(embed))] pub community_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] pub post_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub person_actions: Option, diff --git a/crates/db_views/person_liked_combined/src/impls.rs b/crates/db_views/person_liked_combined/src/impls.rs index 723cfdfee..0d558d93c 100644 --- a/crates/db_views/person_liked_combined/src/impls.rs +++ b/crates/db_views/person_liked_combined/src/impls.rs @@ -33,7 +33,6 @@ use lemmy_db_schema::{ image_details_join, my_comment_actions_join, my_community_actions_join, - my_instance_actions_person_join, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -122,8 +121,6 @@ impl PersonLikedCombinedViewInternal { my_comment_actions_join(Some(my_person_id)); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(Some(my_person_id)); - let my_instance_actions_person_join: my_instance_actions_person_join = - my_instance_actions_person_join(Some(my_person_id)); let my_person_actions_join: my_person_actions_join = my_person_actions_join(Some(my_person_id)); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -131,20 +128,20 @@ impl PersonLikedCombinedViewInternal { person_liked_combined::table .left_join(comment_join) .inner_join(post_join) - .inner_join(item_creator_join) .inner_join(community_join()) + .inner_join(item_creator_join) + .left_join(image_details_join()) .left_join(creator_community_actions_join()) - .left_join(my_local_user_admin_join) .left_join(creator_local_user_admin_join()) - .left_join(my_community_actions_join) - .left_join(my_instance_actions_person_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_community_instance_actions_join()) .left_join(creator_local_instance_actions_join) + // The my_'s have to come last to avoid stack overflows .left_join(my_post_actions_join) .left_join(my_person_actions_join) .left_join(my_comment_actions_join) - .left_join(image_details_join()) + .left_join(my_community_actions_join) + .left_join(my_local_user_admin_join) } } @@ -229,7 +226,6 @@ impl InternalToCombinedView for PersonLikedCombinedViewInternal { community_actions: v.community_actions, comment_actions: v.comment_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, post_tags: v.post_tags, can_mod: v.can_mod, @@ -246,7 +242,6 @@ impl InternalToCombinedView for PersonLikedCombinedViewInternal { community_actions: v.community_actions, post_actions: v.post_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, tags: v.post_tags, can_mod: v.can_mod, diff --git a/crates/db_views/person_liked_combined/src/lib.rs b/crates/db_views/person_liked_combined/src/lib.rs index c004445c4..544099304 100644 --- a/crates/db_views/person_liked_combined/src/lib.rs +++ b/crates/db_views/person_liked_combined/src/lib.rs @@ -5,7 +5,6 @@ use lemmy_db_schema::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, person::{Person, PersonActions}, post::{Post, PostActions}, tag::TagsView, @@ -23,9 +22,11 @@ use { lemmy_db_schema::utils::queries::{ creator_banned_from_community, creator_banned_within_community, + creator_is_admin, creator_is_moderator, + local_user_can_mod, + post_tags_fragment, }, - lemmy_db_schema::utils::queries::{creator_is_admin, local_user_can_mod, post_tags_fragment}, lemmy_db_views_local_user::LocalUserView, }; @@ -50,8 +51,6 @@ pub(crate) struct PersonLikedCombinedViewInternal { #[cfg_attr(feature = "full", diesel(embed))] pub community_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] pub post_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub person_actions: Option, diff --git a/crates/db_views/person_saved_combined/src/impls.rs b/crates/db_views/person_saved_combined/src/impls.rs index 21c3bbfe9..f1fe5cdc3 100644 --- a/crates/db_views/person_saved_combined/src/impls.rs +++ b/crates/db_views/person_saved_combined/src/impls.rs @@ -33,7 +33,6 @@ use lemmy_db_schema::{ image_details_join, my_comment_actions_join, my_community_actions_join, - my_instance_actions_person_join, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -120,8 +119,6 @@ impl PersonSavedCombinedViewInternal { my_comment_actions_join(Some(my_person_id)); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(Some(my_person_id)); - let my_instance_actions_person_join: my_instance_actions_person_join = - my_instance_actions_person_join(Some(my_person_id)); let my_person_actions_join: my_person_actions_join = my_person_actions_join(Some(my_person_id)); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -131,18 +128,17 @@ impl PersonSavedCombinedViewInternal { .inner_join(post_join) .inner_join(item_creator_join) .inner_join(community_join()) + .left_join(image_details_join()) .left_join(creator_community_actions_join()) - .left_join(my_local_user_admin_join) .left_join(creator_local_user_admin_join()) - .left_join(my_community_actions_join) - .left_join(my_instance_actions_person_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_community_instance_actions_join()) .left_join(creator_local_instance_actions_join) + .left_join(my_community_actions_join) + .left_join(my_local_user_admin_join) .left_join(my_post_actions_join) .left_join(my_person_actions_join) .left_join(my_comment_actions_join) - .left_join(image_details_join()) } } @@ -219,7 +215,6 @@ impl InternalToCombinedView for PersonSavedCombinedViewInternal { community_actions: v.community_actions, comment_actions: v.comment_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, post_tags: v.post_tags, can_mod: v.can_mod, @@ -236,7 +231,6 @@ impl InternalToCombinedView for PersonSavedCombinedViewInternal { community_actions: v.community_actions, post_actions: v.post_actions, person_actions: v.person_actions, - instance_actions: v.instance_actions, creator_is_admin: v.item_creator_is_admin, tags: v.post_tags, can_mod: v.can_mod, diff --git a/crates/db_views/person_saved_combined/src/lib.rs b/crates/db_views/person_saved_combined/src/lib.rs index a4310ef1c..2f4fc320b 100644 --- a/crates/db_views/person_saved_combined/src/lib.rs +++ b/crates/db_views/person_saved_combined/src/lib.rs @@ -5,7 +5,6 @@ use lemmy_db_schema::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, person::{Person, PersonActions}, post::{Post, PostActions}, tag::TagsView, @@ -22,9 +21,12 @@ use { lemmy_db_schema::utils::queries::{ creator_banned_from_community, creator_banned_within_community, + creator_is_admin, creator_is_moderator, + local_user_can_mod, + post_tags_fragment, }, - lemmy_db_schema::utils::queries::{creator_is_admin, local_user_can_mod, post_tags_fragment}, + lemmy_db_views_local_user::LocalUserView, }; @@ -49,8 +51,6 @@ pub(crate) struct PersonSavedCombinedViewInternal { #[cfg_attr(feature = "full", diesel(embed))] pub community_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] pub post_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub person_actions: Option, diff --git a/crates/db_views/post/src/impls.rs b/crates/db_views/post/src/impls.rs index bef992e80..33b4e29eb 100644 --- a/crates/db_views/post/src/impls.rs +++ b/crates/db_views/post/src/impls.rs @@ -41,7 +41,8 @@ use lemmy_db_schema::{ filter_not_unlisted_or_is_subscribed, image_details_join, my_community_actions_join, - my_instance_actions_community_join, + my_instance_communities_actions_join, + my_instance_persons_actions_join_1, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -98,8 +99,10 @@ impl PostView { my_community_actions_join(my_person_id); let my_post_actions_join: my_post_actions_join = my_post_actions_join(my_person_id); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(my_person_id); - let my_instance_actions_community_join: my_instance_actions_community_join = - my_instance_actions_community_join(my_person_id); + let my_instance_communities_actions_join: my_instance_communities_actions_join = + my_instance_communities_actions_join(my_person_id); + let my_instance_persons_actions_join_1: my_instance_persons_actions_join_1 = + my_instance_persons_actions_join_1(my_person_id); let my_person_actions_join: my_person_actions_join = my_person_actions_join(my_person_id); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -108,15 +111,16 @@ impl PostView { .inner_join(person::table) .inner_join(community::table) .left_join(image_details_join()) - .left_join(my_community_actions_join) - .left_join(my_person_actions_join) - .left_join(my_post_actions_join) - .left_join(my_instance_actions_community_join) - .left_join(my_local_user_admin_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_community_instance_actions_join()) .left_join(creator_local_instance_actions_join) .left_join(creator_community_actions_join()) + .left_join(my_community_actions_join) + .left_join(my_person_actions_join) + .left_join(my_post_actions_join) + .left_join(my_instance_communities_actions_join) + .left_join(my_instance_persons_actions_join_1) + .left_join(my_local_user_admin_join) } pub async fn read( @@ -583,7 +587,13 @@ mod tests { CommunityPersonBanForm, CommunityUpdateForm, }, - instance::{Instance, InstanceActions, InstanceBanForm, InstanceBlockForm}, + instance::{ + Instance, + InstanceActions, + InstanceBanForm, + InstanceCommunitiesBlockForm, + InstancePersonsBlockForm, + }, keyword_block::LocalUserKeywordBlock, language::Language, local_site::{LocalSite, LocalSiteUpdateForm}, @@ -1541,10 +1551,12 @@ mod tests { #[test_context(Data)] #[tokio::test] #[serial] - async fn post_listing_instance_block(data: &mut Data) -> LemmyResult<()> { - const POST_FROM_BLOCKED_INSTANCE: &str = "post on blocked instance"; - const POST_LISTING_WITH_BLOCKED: [&str; 4] = [ - POST_FROM_BLOCKED_INSTANCE, + async fn post_listing_instance_block_communities(data: &mut Data) -> LemmyResult<()> { + const POST_FROM_BLOCKED_INSTANCE_COMMS: &str = "post on blocked instance"; + const HOWARD_POST: &str = "howard post"; + const POST_LISTING_WITH_BLOCKED: [&str; 5] = [ + HOWARD_POST, + POST_FROM_BLOCKED_INSTANCE_COMMS, POST_WITH_TAGS, POST_BY_BOT, POST, @@ -1553,10 +1565,11 @@ mod tests { let pool = &data.pool(); let pool = &mut pool.into(); - let blocked_instance = Instance::read_or_create(pool, "another_domain.tld".to_string()).await?; + let blocked_instance_comms = + Instance::read_or_create(pool, "another_domain.tld".to_string()).await?; let community_form = CommunityInsertForm::new( - blocked_instance.id, + blocked_instance_comms.id, "test_community_4".to_string(), "none".to_owned(), "pubkey".to_string(), @@ -1566,25 +1579,37 @@ mod tests { let post_form = PostInsertForm { language_id: Some(LanguageId(1)), ..PostInsertForm::new( - POST_FROM_BLOCKED_INSTANCE.to_string(), + POST_FROM_BLOCKED_INSTANCE_COMMS.to_string(), data.bot.person.id, inserted_community.id, ) }; let post_from_blocked_instance = Post::create(pool, &post_form).await?; + // Create a person on that comm-blocked instance, + // have them create a post from a non-instance-comm blocked community. + // Make sure others can see it. + let howard_form = PersonInsertForm::test_form(blocked_instance_comms.id, "howard"); + let howard = Person::create(pool, &howard_form).await?; + let howard_post_form = PostInsertForm { + language_id: Some(LanguageId(1)), + ..PostInsertForm::new(HOWARD_POST.to_string(), howard.id, data.community.id) + }; + let _post_from_blocked_instance_user = Post::create(pool, &howard_post_form).await?; + // no instance block, should return all posts let post_listings_all = data.default_post_query().list(&data.site, pool).await?; assert_eq!(POST_LISTING_WITH_BLOCKED, *names(&post_listings_all)); - // block the instance - let block_form = InstanceBlockForm::new(data.tegan.person.id, blocked_instance.id); - InstanceActions::block(pool, &block_form).await?; + // block the instance communities + let block_form = + InstanceCommunitiesBlockForm::new(data.tegan.person.id, blocked_instance_comms.id); + InstanceActions::block_communities(pool, &block_form).await?; // now posts from communities on that instance should be hidden let post_listings_blocked = data.default_post_query().list(&data.site, pool).await?; assert_eq!( - vec![POST_WITH_TAGS, POST_BY_BOT, POST], + vec![HOWARD_POST, POST_WITH_TAGS, POST_BY_BOT, POST], names(&post_listings_blocked) ); assert!(post_listings_blocked @@ -1603,11 +1628,92 @@ mod tests { CommunityActions::unfollow(pool, data.tegan.person.id, inserted_community.id).await?; // after unblocking it should return all posts again - InstanceActions::unblock(pool, &block_form).await?; + InstanceActions::unblock_communities(pool, &block_form).await?; let post_listings_blocked = data.default_post_query().list(&data.site, pool).await?; assert_eq!(POST_LISTING_WITH_BLOCKED, *names(&post_listings_blocked)); - Instance::delete(pool, blocked_instance.id).await?; + Instance::delete(pool, blocked_instance_comms.id).await?; + Ok(()) + } + + #[test_context(Data)] + #[tokio::test] + #[serial] + async fn post_listing_instance_block_persons(data: &mut Data) -> LemmyResult<()> { + const POST_FROM_BLOCKED_INSTANCE_USERS: &str = "post from blocked instance user"; + const POST_TO_UNBLOCKED_COMM: &str = "post to unblocked comm"; + const POST_LISTING_WITH_BLOCKED: [&str; 5] = [ + POST_TO_UNBLOCKED_COMM, + POST_FROM_BLOCKED_INSTANCE_USERS, + POST_WITH_TAGS, + POST_BY_BOT, + POST, + ]; + + let pool = &data.pool(); + let pool = &mut pool.into(); + + let blocked_instance_persons = + Instance::read_or_create(pool, "another_domain.tld".to_string()).await?; + + let howard_form = PersonInsertForm::test_form(blocked_instance_persons.id, "howard"); + let howard = Person::create(pool, &howard_form).await?; + + let community_form = CommunityInsertForm::new( + blocked_instance_persons.id, + "test_community_8".to_string(), + "none".to_owned(), + "pubkey".to_string(), + ); + let inserted_community = Community::create(pool, &community_form).await?; + + // Create a post from the blocked user on a safe community + let blocked_post_form = PostInsertForm { + language_id: Some(LanguageId(1)), + ..PostInsertForm::new( + POST_FROM_BLOCKED_INSTANCE_USERS.to_string(), + howard.id, + data.community.id, + ) + }; + let post_from_blocked_instance = Post::create(pool, &blocked_post_form).await?; + + // Also create a post from an unblocked user + let unblocked_post_form = PostInsertForm { + language_id: Some(LanguageId(1)), + ..PostInsertForm::new( + POST_TO_UNBLOCKED_COMM.to_string(), + data.bot.person.id, + inserted_community.id, + ) + }; + let _post_to_unblocked_comm = Post::create(pool, &unblocked_post_form).await?; + + // no instance block, should return all posts + let post_listings_all = data.default_post_query().list(&data.site, pool).await?; + assert_eq!(POST_LISTING_WITH_BLOCKED, *names(&post_listings_all)); + + // block the instance communities + let block_form = + InstancePersonsBlockForm::new(data.tegan.person.id, blocked_instance_persons.id); + InstanceActions::block_persons(pool, &block_form).await?; + + // now posts from users on that instance should be hidden + let post_listings_blocked = data.default_post_query().list(&data.site, pool).await?; + assert_eq!( + vec![POST_TO_UNBLOCKED_COMM, POST_WITH_TAGS, POST_BY_BOT, POST], + names(&post_listings_blocked) + ); + assert!(post_listings_blocked + .iter() + .all(|p| p.post.id != post_from_blocked_instance.id)); + + // after unblocking it should return all posts again + InstanceActions::unblock_persons(pool, &block_form).await?; + let post_listings_blocked = data.default_post_query().list(&data.site, pool).await?; + assert_eq!(POST_LISTING_WITH_BLOCKED, *names(&post_listings_blocked)); + + Instance::delete(pool, blocked_instance_persons.id).await?; Ok(()) } @@ -2011,11 +2117,6 @@ mod tests { assert!(post_view.creator_banned); - // This should be none, since john wasn't banned, only the creator. - assert!(post_view.instance_actions.is_none()); - - assert!(post_view.creator_banned); - Person::delete(pool, banned_person.id).await?; Ok(()) } diff --git a/crates/db_views/post/src/lib.rs b/crates/db_views/post/src/lib.rs index 7439c7c97..db587aafb 100644 --- a/crates/db_views/post/src/lib.rs +++ b/crates/db_views/post/src/lib.rs @@ -1,7 +1,6 @@ use lemmy_db_schema::source::{ community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, person::{Person, PersonActions}, post::{Post, PostActions}, tag::TagsView, @@ -16,8 +15,6 @@ use { lemmy_db_schema::utils::queries::{ creator_banned_from_community, creator_banned_within_community, - }, - lemmy_db_schema::utils::queries::{ creator_is_moderator, local_user_can_mod_post, post_creator_is_admin, @@ -50,8 +47,6 @@ pub struct PostView { pub person_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub post_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, #[cfg_attr(feature = "full", diesel( select_expression = post_creator_is_admin() diff --git a/crates/db_views/search_combined/src/impls.rs b/crates/db_views/search_combined/src/impls.rs index bd0733889..0ae2586ec 100644 --- a/crates/db_views/search_combined/src/impls.rs +++ b/crates/db_views/search_combined/src/impls.rs @@ -43,7 +43,6 @@ use lemmy_db_schema::{ image_details_join, my_comment_actions_join, my_community_actions_join, - my_instance_actions_person_join, my_local_user_admin_join, my_person_actions_join, my_post_actions_join, @@ -133,8 +132,6 @@ impl SearchCombinedViewInternal { let my_post_actions_join: my_post_actions_join = my_post_actions_join(my_person_id); let my_comment_actions_join: my_comment_actions_join = my_comment_actions_join(my_person_id); let my_local_user_admin_join: my_local_user_admin_join = my_local_user_admin_join(my_person_id); - let my_instance_actions_person_join: my_instance_actions_person_join = - my_instance_actions_person_join(my_person_id); let my_person_actions_join: my_person_actions_join = my_person_actions_join(my_person_id); let creator_local_instance_actions_join: creator_local_instance_actions_join = creator_local_instance_actions_join(local_instance_id); @@ -145,17 +142,16 @@ impl SearchCombinedViewInternal { .left_join(multi_community_join) .left_join(item_creator_join) .left_join(community_join) + .left_join(image_details_join()) .left_join(creator_community_actions_join()) - .left_join(my_local_user_admin_join) .left_join(creator_local_user_admin_join()) - .left_join(my_community_actions_join) - .left_join(my_instance_actions_person_join) .left_join(creator_home_instance_actions_join()) .left_join(creator_local_instance_actions_join) + .left_join(my_local_user_admin_join) + .left_join(my_community_actions_join) .left_join(my_post_actions_join) .left_join(my_person_actions_join) .left_join(my_comment_actions_join) - .left_join(image_details_join()) } } @@ -428,7 +424,6 @@ impl InternalToCombinedView for SearchCombinedViewInternal { community, creator, community_actions: v.community_actions, - instance_actions: v.instance_actions, person_actions: v.person_actions, comment_actions: v.comment_actions, creator_is_admin: v.item_creator_is_admin, @@ -448,7 +443,6 @@ impl InternalToCombinedView for SearchCombinedViewInternal { creator_is_admin: v.item_creator_is_admin, image_details: v.image_details, community_actions: v.community_actions, - instance_actions: v.instance_actions, person_actions: v.person_actions, post_actions: v.post_actions, tags: v.post_tags, @@ -461,7 +455,6 @@ impl InternalToCombinedView for SearchCombinedViewInternal { Some(SearchCombinedView::Community(CommunityView { community, community_actions: v.community_actions, - instance_actions: v.instance_actions, can_mod: v.can_mod, post_tags: v.community_post_tags, })) diff --git a/crates/db_views/search_combined/src/lib.rs b/crates/db_views/search_combined/src/lib.rs index 7347a1a63..fd73f9468 100644 --- a/crates/db_views/search_combined/src/lib.rs +++ b/crates/db_views/search_combined/src/lib.rs @@ -5,7 +5,6 @@ use lemmy_db_schema::{ comment::{Comment, CommentActions}, community::{Community, CommunityActions}, images::ImageDetails, - instance::InstanceActions, multi_community::MultiCommunity, person::{Person, PersonActions}, post::{Post, PostActions}, @@ -58,8 +57,6 @@ pub(crate) struct SearchCombinedViewInternal { #[cfg_attr(feature = "full", diesel(embed))] pub community_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] - pub instance_actions: Option, - #[cfg_attr(feature = "full", diesel(embed))] pub post_actions: Option, #[cfg_attr(feature = "full", diesel(embed))] pub person_actions: Option, diff --git a/crates/db_views/site/src/api.rs b/crates/db_views/site/src/api.rs index f42fca0bf..ce0012545 100644 --- a/crates/db_views/site/src/api.rs +++ b/crates/db_views/site/src/api.rs @@ -439,7 +439,8 @@ pub struct MyUserInfo { pub follows: Vec, pub moderates: Vec, pub community_blocks: Vec, - pub instance_blocks: Vec, + pub instance_communities_blocks: Vec, + pub instance_persons_blocks: Vec, pub person_blocks: Vec, pub keyword_blocks: Vec, pub discussion_languages: Vec, @@ -561,8 +562,17 @@ pub struct UpdateTotpResponse { #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))] #[cfg_attr(feature = "ts-rs", ts(optional_fields, export))] -/// Block an instance as user -pub struct UserBlockInstanceParams { +/// Block an instance's persons. +pub struct UserBlockInstancePersonsParams { + pub instance_id: InstanceId, + pub block: bool, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))] +#[cfg_attr(feature = "ts-rs", ts(optional_fields, export))] +/// Block an instance's communities. +pub struct UserBlockInstanceCommunitiesParams { pub instance_id: InstanceId, pub block: bool, } @@ -713,6 +723,7 @@ pub enum PostOrCommentOrPrivateMessage { /// Be careful with any changes to this struct, to avoid breaking changes which could prevent /// importing older backups. #[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[serde(deny_unknown_fields)] #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))] #[cfg_attr(feature = "ts-rs", ts(optional_fields, export))] pub struct UserSettingsBackup { @@ -736,7 +747,10 @@ pub struct UserSettingsBackup { #[serde(default)] pub blocked_users: Vec, #[serde(default)] - pub blocked_instances: Vec, + #[serde(alias = "blocked_instances")] // the name used by v0.19 + pub blocked_instances_communities: Vec, + #[serde(default)] + pub blocked_instances_persons: Vec, } #[skip_serializing_none] diff --git a/crates/db_views/site/src/impls.rs b/crates/db_views/site/src/impls.rs index 4a287efbb..8ab09075c 100644 --- a/crates/db_views/site/src/impls.rs +++ b/crates/db_views/site/src/impls.rs @@ -62,7 +62,8 @@ pub fn user_backup_list_to_user_settings_backup( settings: Some(local_user_view.local_user), followed_communities: vec_into(lists.followed_communities), blocked_communities: vec_into(lists.blocked_communities), - blocked_instances: lists.blocked_instances, + blocked_instances_communities: lists.blocked_instances_communities, + blocked_instances_persons: lists.blocked_instances_persons, blocked_users: vec_into(lists.blocked_users), saved_posts: vec_into(lists.saved_posts), saved_comments: vec_into(lists.saved_comments), diff --git a/crates/federate/src/inboxes.rs b/crates/federate/src/inboxes.rs index 9e00f161a..879e60355 100644 --- a/crates/federate/src/inboxes.rs +++ b/crates/federate/src/inboxes.rs @@ -151,7 +151,7 @@ impl CommunityInboxCollector { // happens much later - by doing it here, we can ensure that in the happy case, this // function returns 0 urls which means the system doesn't have to create a tokio // task for sending at all (since that task has a fair amount of overhead) - .filter(|&u| (u.domain() == Some(&self.domain))) + .filter(|&u| u.domain() == Some(&self.domain)) .map(|u| u.inner().clone()), ); tracing::trace!( diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index c0bdd1cc5..d8a790cfa 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -129,7 +129,8 @@ pub enum LemmyErrorType { InvalidUrlScheme, CouldntSendWebmention, ContradictingFilters, - InstanceBlockAlreadyExists, + InstanceBlockCommunitiesAlreadyExists, + InstanceBlockPersonsAlreadyExists, /// Thrown when an API call is submitted with more than 1000 array elements, see /// [[MAX_API_PARAM_ELEMENTS]] TooManyItems, diff --git a/migrations/2025-06-12-164319_instance_block_communities_persons/down.sql b/migrations/2025-06-12-164319_instance_block_communities_persons/down.sql new file mode 100644 index 000000000..8a02067ed --- /dev/null +++ b/migrations/2025-06-12-164319_instance_block_communities_persons/down.sql @@ -0,0 +1,5 @@ +ALTER TABLE instance_actions RENAME COLUMN blocked_communities_at TO blocked_at; + +ALTER TABLE instance_actions + DROP COLUMN blocked_persons_at; + diff --git a/migrations/2025-06-12-164319_instance_block_communities_persons/up.sql b/migrations/2025-06-12-164319_instance_block_communities_persons/up.sql new file mode 100644 index 000000000..7cd5d6523 --- /dev/null +++ b/migrations/2025-06-12-164319_instance_block_communities_persons/up.sql @@ -0,0 +1,9 @@ +-- Currently, the instance.blocked_at columns only blocks communities from the given instance. +-- +-- This creates a new block type, to also be able to block persons. +-- Also changes the name of blocked_at to blocked_communities_at +ALTER TABLE instance_actions RENAME COLUMN blocked_at TO blocked_communities_at; + +ALTER TABLE instance_actions + ADD COLUMN blocked_persons_at timestamptz; + diff --git a/src/api_routes.rs b/src/api_routes.rs index 2e4b364f6..f26a98485 100644 --- a/src/api_routes.rs +++ b/src/api_routes.rs @@ -52,7 +52,7 @@ use lemmy_api::{ reset_password::reset_password, save_settings::save_user_settings, update_totp::update_totp, - user_block_instance::user_block_instance, + user_block_instance::{user_block_instance_communities, user_block_instance_persons}, validate_auth::validate_auth, verify_email::verify_email, }, @@ -382,7 +382,11 @@ pub fn config(cfg: &mut ServiceConfig, rate_limit: &RateLimit) { scope("/block") .route("/person", post().to(user_block_person)) .route("/community", post().to(user_block_community)) - .route("/instance", post().to(user_block_instance)), + .route( + "/instance/communities", + post().to(user_block_instance_communities), + ) + .route("/instance/persons", post().to(user_block_instance_persons)), ) .route("/saved", get().to(list_person_saved)) .route("/read", get().to(list_person_read))