From 6569f61fc4dbc62fb9eaf09d6a4633e6277d2ee2 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 29 Jan 2025 14:06:38 +0100 Subject: [PATCH 01/22] =?UTF-8?q?=E2=9C=85(e2e)=20fix=20flakiness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some flakiness appeared in the e2e tests. It started to impact many pull requests. Time to fix them. --- .../apps/e2e/__tests__/app-impress/common.ts | 23 +++- .../__tests__/app-impress/doc-editor.spec.ts | 14 +- .../app-impress/doc-favorite.spec.ts | 75 ----------- .../__tests__/app-impress/doc-grid.spec.ts | 27 ++++ .../app-impress/doc-member-create.spec.ts | 18 ++- .../__tests__/app-impress/doc-search.spec.ts | 120 ++++++------------ .../app-impress/doc-visibility.spec.ts | 4 + src/frontend/apps/e2e/package.json | 2 - .../doc-share/components/DocShareModal.tsx | 5 +- .../docs/docs-grid/components/DocsGrid.tsx | 1 + .../docs-grid/components/SimpleDocItem.tsx | 8 +- 11 files changed, 117 insertions(+), 180 deletions(-) delete mode 100644 src/frontend/apps/e2e/__tests__/app-impress/doc-favorite.spec.ts diff --git a/src/frontend/apps/e2e/__tests__/app-impress/common.ts b/src/frontend/apps/e2e/__tests__/app-impress/common.ts index e067bc7a..6e65dc65 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/common.ts @@ -26,7 +26,7 @@ export const createDoc = async ( page: Page, docName: string, browserName: string, - length: number, + length: number = 1, ) => { const randomDocs = randomName(docName, browserName, length); @@ -40,7 +40,8 @@ export const createDoc = async ( }) .click(); - const input = page.getByRole('textbox', { name: 'doc title input' }); + const input = page.getByLabel('doc title input'); + await expect(input).toHaveText(''); await input.click(); await input.fill(randomDocs[i]); await input.blur(); @@ -91,6 +92,22 @@ export const addNewMember = async ( return users[index].email; }; +export const getGridRow = async (page: Page, title: string) => { + const docsGrid = page.getByRole('grid'); + await expect(docsGrid).toBeVisible(); + await expect(page.getByTestId('grid-loader')).toBeHidden(); + + const rows = docsGrid.getByRole('row'); + + const row = rows.filter({ + hasText: title, + }); + + await expect(row).toBeVisible(); + + return row; +}; + interface GoToGridDocOptions { nthRow?: number; title?: string; @@ -104,7 +121,7 @@ export const goToGridDoc = async ( const docsGrid = page.getByTestId('docs-grid'); await expect(docsGrid).toBeVisible(); - await expect(docsGrid.getByTestId('grid-loader')).toBeHidden(); + await expect(page.getByTestId('grid-loader')).toBeHidden(); const rows = docsGrid.getByRole('row'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts index 8dba8dab..476510e1 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts @@ -220,7 +220,7 @@ test.describe('Doc Editor', () => { browserName, }) => { // Check the first doc - const [doc] = await createDoc(page, 'doc-saves-change', browserName, 1); + const [doc] = await createDoc(page, 'doc-saves-change', browserName); await verifyDocName(page, doc); const editor = page.locator('.ProseMirror'); @@ -228,9 +228,11 @@ test.describe('Doc Editor', () => { await editor.fill('Hello World Doc persisted 1'); await expect(editor.getByText('Hello World Doc persisted 1')).toBeVisible(); - const secondDoc = await goToGridDoc(page, { - nthRow: 2, - }); + const [secondDoc] = await createDoc( + page, + 'doc-saves-change-other', + browserName, + ); await verifyDocName(page, secondDoc); @@ -238,6 +240,7 @@ test.describe('Doc Editor', () => { title: doc, }); + await verifyDocName(page, doc); await expect(editor.getByText('Hello World Doc persisted 1')).toBeVisible(); }); @@ -246,8 +249,7 @@ test.describe('Doc Editor', () => { test.skip(browserName === 'webkit', 'This test is very flaky with webkit'); // Check the first doc - const doc = await goToGridDoc(page); - + const [doc] = await createDoc(page, 'doc-quit-1', browserName, 1); await verifyDocName(page, doc); const editor = page.locator('.ProseMirror'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-favorite.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-favorite.spec.ts deleted file mode 100644 index f1fe950f..00000000 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-favorite.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { expect, test } from '@playwright/test'; - -import { createDoc, verifyDocName } from './common'; - -type SmallDoc = { - id: string; - title: string; -}; - -test.describe('Document favorite', () => { - test('it check the favorite workflow', async ({ page, browserName }) => { - const id = Math.random().toString(7); - await page.goto('/'); - - // Create document - const createdDoc = await createDoc(page, `Doc ${id}`, browserName, 1); - await verifyDocName(page, createdDoc[0]); - - // Reload page - await page.reload(); - await page.goto('/'); - - // Get all documents - let docs: SmallDoc[] = []; - const response = await page.waitForResponse( - (response) => - response.url().endsWith('documents/?page=1') && - response.status() === 200, - ); - const result = await response.json(); - docs = result.results as SmallDoc[]; - const docsGrid = page.getByTestId('docs-grid'); - await docsGrid.getByRole('heading', { name: 'All docs' }).click(); - await expect(docsGrid.getByText(`Doc ${id}`)).toBeVisible(); - const doc = docs.find((doc) => doc.title === createdDoc[0]) as SmallDoc; - - // Check document - expect(doc).not.toBeUndefined(); - expect(doc?.title).toBe(createdDoc[0]); - - // Open document actions - const button = docsGrid.getByTestId(`docs-grid-actions-button-${doc.id}`); - await expect(button).toBeVisible(); - await button.click(); - - // Pin document - const pinButton = page.getByTestId(`docs-grid-actions-pin-${docs[0].id}`); - await expect(pinButton).toBeVisible(); - await pinButton.click(); - - // Check response - const responsePin = await page.waitForResponse( - (response) => - response.url().includes(`documents/${doc.id}/favorite/`) && - response.status() === 201, - ); - expect(responsePin.ok()).toBeTruthy(); - - // Check left panel favorites - const leftPanelFavorites = page.getByTestId('left-panel-favorites'); - await expect(leftPanelFavorites).toBeVisible(); - await expect(leftPanelFavorites.getByText(`Doc ${id}`)).toBeVisible(); - - // - await button.click(); - const unpinButton = page.getByTestId( - `docs-grid-actions-unpin-${docs[0].id}`, - ); - await expect(unpinButton).toBeVisible(); - await unpinButton.click(); - - // Check left panel favorites - await expect(leftPanelFavorites.getByText(`Doc ${id}`)).toBeHidden(); - }); -}); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts index 1963bf1c..772ec104 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts @@ -1,5 +1,7 @@ import { expect, test } from '@playwright/test'; +import { createDoc, getGridRow } from './common'; + type SmallDoc = { id: string; title: string; @@ -92,6 +94,31 @@ test.describe('Documents Grid mobile', () => { }); test.describe('Document grid item options', () => { + test('it pins a document', async ({ page, browserName }) => { + const [docTitle] = await createDoc(page, `Favorite doc`, browserName); + + await page.goto('/'); + + const row = await getGridRow(page, docTitle); + + // Pin + await row.getByText(`more_horiz`).click(); + await page.getByText('push_pin').click(); + + // Check is pinned + await expect(row.getByLabel('Pin document icon')).toBeVisible(); + const leftPanelFavorites = page.getByTestId('left-panel-favorites'); + await expect(leftPanelFavorites.getByText(docTitle)).toBeVisible(); + + // Unpin + await row.getByText(`more_horiz`).click(); + await page.getByText('Unpin').click(); + + // Check is unpinned + await expect(row.getByLabel('Pin document icon')).toBeHidden(); + await expect(leftPanelFavorites.getByText(docTitle)).toBeHidden(); + }); + test('it deletes the document', async ({ page }) => { let docs: SmallDoc[] = []; const response = await page.waitForResponse( diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts index 04015e9e..ec2a3953 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts @@ -26,7 +26,7 @@ test.describe('Document create member', () => { const response = await responsePromise; const users = (await response.json()).results as { email: string; - full_name: string; + full_name?: string | null; }[]; const list = page.getByTestId('doc-share-add-member-list'); @@ -40,7 +40,9 @@ test.describe('Document create member', () => { await expect( list.getByTestId(`doc-share-add-member-${users[0].email}`), ).toBeVisible(); - await expect(list.getByText(`${users[0].full_name}`)).toBeVisible(); + await expect( + list.getByText(`${users[0].full_name || users[0].email}`), + ).toBeVisible(); // Select user 2 and verify tag await inputSearch.fill('user'); @@ -51,7 +53,9 @@ test.describe('Document create member', () => { await expect( list.getByTestId(`doc-share-add-member-${users[1].email}`), ).toBeVisible(); - await expect(list.getByText(`${users[1].full_name}`)).toBeVisible(); + await expect( + list.getByText(`${users[1].full_name || users[1].email}`), + ).toBeVisible(); // Select email and verify tag const email = randomName('test@test.fr', browserName, 1)[0]; @@ -81,7 +85,9 @@ test.describe('Document create member', () => { // Check user added await expect(page.getByText('Share with 3 users')).toBeVisible(); await expect( - quickSearchContent.getByText(users[0].full_name).first(), + quickSearchContent + .getByText(users[0].full_name || users[0].email) + .first(), ).toBeVisible(); await expect( quickSearchContent.getByText(users[0].email).first(), @@ -90,7 +96,9 @@ test.describe('Document create member', () => { quickSearchContent.getByText(users[1].email).first(), ).toBeVisible(); await expect( - quickSearchContent.getByText(users[1].full_name).first(), + quickSearchContent + .getByText(users[1].full_name || users[1].email) + .first(), ).toBeVisible(); }); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts index 89540f93..143e383e 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts @@ -1,21 +1,32 @@ import { expect, test } from '@playwright/test'; -import { DateTime } from 'luxon'; import { createDoc, verifyDocName } from './common'; -type SmallDoc = { - id: string; - title: string; - updated_at: string; -}; - test.beforeEach(async ({ page }) => { await page.goto('/'); }); test.describe('Document search', () => { - test('it checks all elements are visible', async ({ page }) => { + test('it searches documents', async ({ page, browserName }) => { + const [doc1Title] = await createDoc( + page, + 'My doc search super', + browserName, + 1, + ); + await verifyDocName(page, doc1Title); + await page.goto('/'); + + const [doc2Title] = await createDoc( + page, + 'My doc search doc', + browserName, + 1, + ); + await verifyDocName(page, doc2Title); + await page.goto('/'); await page.getByRole('button', { name: 'search' }).click(); + await expect( page.getByRole('img', { name: 'No active search' }), ).toBeVisible(); @@ -24,91 +35,32 @@ test.describe('Document search', () => { page.getByLabel('Search modal').getByText('search'), ).toBeVisible(); - await expect( - page.getByPlaceholder('Type the name of a document'), - ).toBeVisible(); - }); + const inputSearch = page.getByPlaceholder('Type the name of a document'); - test('it checks search for a document', async ({ page, browserName }) => { - const id = Math.random().toString(36).substring(7); + await inputSearch.click(); + await inputSearch.fill('My doc search'); + await inputSearch.press('ArrowDown'); - const doc1 = await createDoc(page, `My super ${id} doc`, browserName, 1); - await verifyDocName(page, doc1[0]); - await page.goto('/'); - const doc2 = await createDoc( - page, - `My super ${id} very doc`, - browserName, - 1, - ); - await verifyDocName(page, doc2[0]); - await page.goto('/'); - await page.getByRole('button', { name: 'search' }).click(); - await page.getByPlaceholder('Type the name of a document').click(); - await page - .getByPlaceholder('Type the name of a document') - .fill(`My super ${id}`); - - let responsePromisePage = page.waitForResponse( - (response) => - response.url().includes(`/documents/?page=1&title=My+super+${id}`) && - response.status() === 200, - ); - let response = await responsePromisePage; - let result = (await response.json()) as { results: SmallDoc[] }; - let docs = result.results; - expect(docs.length).toEqual(2); - - await Promise.all( - docs.map(async (doc: SmallDoc) => { - await expect( - page.getByTestId(`doc-search-item-${doc.id}`), - ).toBeVisible(); - const updatedAt = DateTime.fromISO(doc.updated_at ?? DateTime.now()) - .setLocale('en') - .toRelative(); - await expect( - page.getByTestId(`doc-search-item-${doc.id}`).getByText(updatedAt!), - ).toBeVisible(); - }), - ); - - const firstDoc = docs[0]; + const listSearch = page.getByRole('listbox').getByRole('group'); + const rowdoc = listSearch.getByRole('option').first(); + await expect(rowdoc.getByText('keyboard_return')).toBeVisible(); + await expect(rowdoc.getByText(/seconds? ago/)).toBeVisible(); await expect( - page - .getByTestId(`doc-search-item-${firstDoc.id}`) - .getByText('keyboard_return'), + listSearch.getByRole('option').getByText(doc1Title), ).toBeVisible(); - - await page - .getByPlaceholder('Type the name of a document') - .press('ArrowDown'); - - const secondDoc = docs[1]; await expect( - page - .getByTestId(`doc-search-item-${secondDoc.id}`) - .getByText('keyboard_return'), + listSearch.getByRole('option').getByText(doc2Title), ).toBeVisible(); - await page.getByPlaceholder('Type the name of a document').click(); - await page - .getByPlaceholder('Type the name of a document') - .fill(`My super ${id} doc`); + await inputSearch.fill('My doc search super'); - responsePromisePage = page.waitForResponse( - (response) => - response - .url() - .includes(`/documents/?page=1&title=My+super+${id}+doc`) && - response.status() === 200, - ); + await expect( + listSearch.getByRole('option').getByText(doc1Title), + ).toBeVisible(); - response = await responsePromisePage; - result = (await response.json()) as { results: SmallDoc[] }; - docs = result.results; - - expect(docs.length).toEqual(1); + await expect( + listSearch.getByRole('option').getByText(doc2Title), + ).toBeHidden(); }); }); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts index 8414b0c7..dc7fb7eb 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts @@ -171,6 +171,9 @@ test.describe('Doc Visibility: Restricted', () => { await page.goto(urlDoc); + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(1000); + await verifyDocName(page, docTitle); await expect(page.getByLabel('Share button')).toBeVisible(); }); @@ -209,6 +212,7 @@ test.describe('Doc Visibility: Public', () => { page.getByText('The document visibility has been updated.'), ).toBeVisible(); + await expect(page.getByLabel('Visibility mode')).toBeVisible(); await page.getByLabel('Visibility mode').click(); await page .getByRole('button', { diff --git a/src/frontend/apps/e2e/package.json b/src/frontend/apps/e2e/package.json index b9dcad2d..aa041400 100644 --- a/src/frontend/apps/e2e/package.json +++ b/src/frontend/apps/e2e/package.json @@ -13,11 +13,9 @@ }, "devDependencies": { "@playwright/test": "1.49.1", - "@types/luxon": "3.4.2", "@types/node": "*", "@types/pdf-parse": "1.1.4", "eslint-config-impress": "*", - "luxon": "3.5.0", "typescript": "*" }, "dependencies": { diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx index c4ed0638..b9519e41 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx @@ -30,12 +30,9 @@ import { DocShareModalFooter } from './DocShareModalFooter'; import { DocShareModalInviteUserRow } from './DocShareModalInviteUserByEmail'; const ShareModalStyle = createGlobalStyle` - .c__modal__title { padding-bottom: 0 !important; - -} - + } `; type Props = { diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx index 5c125bdb..f511abb2 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGrid.tsx @@ -70,6 +70,7 @@ export const DocsGrid = ({ > { + const { t } = useTranslation(); const { spacingsTokens } = useCunninghamTheme(); const { isDesktop } = useResponsiveStore(); const spacings = spacingsTokens(); @@ -44,7 +46,11 @@ export const SimpleDocItem = ({ filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.05)); `} > - {isPinned ? : } + {isPinned ? ( + + ) : ( + + )} Date: Wed, 29 Jan 2025 14:06:47 +0100 Subject: [PATCH 02/22] =?UTF-8?q?=E2=9C=85(CI)=20fix=20test-e2e-other-brow?= =?UTF-8?q?ser=20job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A recent update to the impress-frontend workflow caused the test-e2e-other-browser job to fail. This commit fixes the issue. --- .github/workflows/impress-frontend.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/impress-frontend.yml b/.github/workflows/impress-frontend.yml index ae07bf2b..c5d17c90 100644 --- a/.github/workflows/impress-frontend.yml +++ b/.github/workflows/impress-frontend.yml @@ -127,8 +127,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Install frontend dependencies - uses: ./.github/workflows/front-dependencies-installation.yml + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20.x" + + - name: Restore the frontend cache + uses: actions/cache@v4 + with: + path: "src/frontend/**/node_modules" + key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true - name: Set e2e env variables run: cat env.d/development/common.e2e.dist >> env.d/development/common.dist From 276b4f7c1b8c2d75e6c8bd191485533b6142456c Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Mon, 16 Dec 2024 16:58:14 +0100 Subject: [PATCH 03/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20django-treebea?= =?UTF-8?q?rd=20to=20allow=20tree=20structure=20on=20documents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We choose to use Django-treebeard for its quality, performance and stability. Adding tree structure to documents is as simple as inheriting from the MP_Node class. --- CHANGELOG.md | 3 +- src/backend/core/admin.py | 47 ++++++++++++++++- src/backend/core/api/serializers.py | 2 +- src/backend/core/api/viewsets.py | 6 ++- src/backend/core/factories.py | 34 ++++++++++++ .../0014_add_tree_structure_to_documents.py | 31 +++++++++++ .../0015_set_path_on_existing_documents.py | 52 +++++++++++++++++++ src/backend/core/models.py | 12 ++++- .../core/tests/test_models_documents.py | 24 +++++++-- .../demo/management/commands/create_demo.py | 7 ++- src/backend/impress/settings.py | 1 + src/backend/pyproject.toml | 1 + 12 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 src/backend/core/migrations/0014_add_tree_structure_to_documents.py create mode 100644 src/backend/core/migrations/0015_set_path_on_existing_documents.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 5719eb92..3cd8268b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,8 @@ and this project adheres to ## Added -- github actions to manage Crowdin workflow +- ✨(backend) allow organizing documents in a tree structure #516 +- ✨(backend) add github actions to manage Crowdin workflow #559 & #563 - 📈Integrate Posthog #540 - 🏷️(backend) add content-type to uploaded files #552 - ✨(frontend) export pdf docx front side #537 diff --git a/src/backend/core/admin.py b/src/backend/core/admin.py index 25dab177..080b492a 100644 --- a/src/backend/core/admin.py +++ b/src/backend/core/admin.py @@ -4,12 +4,16 @@ from django.contrib import admin from django.contrib.auth import admin as auth_admin from django.utils.translation import gettext_lazy as _ +from treebeard.admin import TreeAdmin +from treebeard.forms import movenodeform_factory + from . import models class TemplateAccessInline(admin.TabularInline): """Inline admin class for template accesses.""" + autocomplete_fields = ["user"] model = models.TemplateAccess extra = 0 @@ -111,14 +115,47 @@ class TemplateAdmin(admin.ModelAdmin): class DocumentAccessInline(admin.TabularInline): """Inline admin class for template accesses.""" + autocomplete_fields = ["user"] model = models.DocumentAccess extra = 0 @admin.register(models.Document) -class DocumentAdmin(admin.ModelAdmin): +class DocumentAdmin(TreeAdmin): """Document admin interface declaration.""" + fieldsets = ( + ( + None, + { + "fields": ( + "id", + "title", + ) + }, + ), + ( + _("Permissions"), + { + "fields": ( + "creator", + "link_reach", + "link_role", + ) + }, + ), + ( + _("Tree structure"), + { + "fields": ( + "path", + "depth", + "numchild", + ) + }, + ), + ) + form = movenodeform_factory(models.Document) inlines = (DocumentAccessInline,) list_display = ( "id", @@ -128,6 +165,14 @@ class DocumentAdmin(admin.ModelAdmin): "created_at", "updated_at", ) + readonly_fields = ( + "creator", + "depth", + "id", + "numchild", + "path", + ) + search_fields = ("id", "title") @admin.register(models.Invitation) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index e2369f49..03a092d6 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -287,7 +287,7 @@ class ServerCreateDocumentSerializer(serializers.Serializer): {"content": ["Could not convert content"]} ) from err - document = models.Document.objects.create( + document = models.Document.add_root( title=validated_data["title"], content=document_content, creator=user, diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index a98ad4f5..b5359af5 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -431,7 +431,11 @@ class DocumentViewSet( def perform_create(self, serializer): """Set the current user as creator and owner of the newly created object.""" - obj = serializer.save(creator=self.request.user) + obj = models.Document.add_root( + creator=self.request.user, + **serializer.validated_data, + ) + serializer.instance = obj models.DocumentAccess.objects.create( document=obj, user=self.request.user, diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index f1ce8590..5a77ad09 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -46,6 +46,23 @@ class UserFactory(factory.django.DjangoModelFactory): UserTemplateAccessFactory(user=self, role="owner") +class ParentNodeFactory(factory.declarations.ParameteredAttribute): + """Custom factory attribute for setting the parent node.""" + + def generate(self, step, params): + """ + Generate a parent node for the factory. + + This method is invoked during the factory's build process to determine the parent + node of the current object being created. If `params` is provided, it uses the factory's + metadata to recursively create or fetch the parent node. Otherwise, it returns `None`. + """ + if not params: + return None + subfactory = step.builder.factory_meta.factory + return step.recurse(subfactory, params) + + class DocumentFactory(factory.django.DjangoModelFactory): """A factory to create documents""" @@ -54,6 +71,8 @@ class DocumentFactory(factory.django.DjangoModelFactory): django_get_or_create = ("title",) skip_postgeneration_save = True + parent = ParentNodeFactory() + title = factory.Sequence(lambda n: f"document{n}") content = factory.Sequence(lambda n: f"content{n}") creator = factory.SubFactory(UserFactory) @@ -64,6 +83,21 @@ class DocumentFactory(factory.django.DjangoModelFactory): [r[0] for r in models.LinkRoleChoices.choices] ) + @classmethod + def _create(cls, model_class, *args, **kwargs): + """ + Custom creation logic for the factory: creates a document as a child node if + a parent is provided; otherwise, creates it as a root node. + """ + parent = kwargs.pop("parent", None) + + if parent: + # Add as a child node + return parent.add_child(instance=model_class(**kwargs)) + + # Add as a root node + return model_class.add_root(instance=model_class(**kwargs)) + @factory.post_generation def users(self, create, extracted, **kwargs): """Add users to document from a given list of users with or without roles.""" diff --git a/src/backend/core/migrations/0014_add_tree_structure_to_documents.py b/src/backend/core/migrations/0014_add_tree_structure_to_documents.py new file mode 100644 index 00000000..bd237f74 --- /dev/null +++ b/src/backend/core/migrations/0014_add_tree_structure_to_documents.py @@ -0,0 +1,31 @@ +# Generated by Django 5.1.2 on 2024-12-07 09:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0013_activate_fuzzystrmatch_extension'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='depth', + field=models.PositiveIntegerField(default=0), + preserve_default=False, + ), + migrations.AddField( + model_name='document', + name='numchild', + field=models.PositiveIntegerField(default=0), + ), + migrations.AddField( + model_name='document', + name='path', + # Allow null values pending the next datamigration to populate the field + field=models.CharField(db_collation='C', max_length=252, null=True, unique=True), + preserve_default=False, + ), + ] diff --git a/src/backend/core/migrations/0015_set_path_on_existing_documents.py b/src/backend/core/migrations/0015_set_path_on_existing_documents.py new file mode 100644 index 00000000..250d8dbd --- /dev/null +++ b/src/backend/core/migrations/0015_set_path_on_existing_documents.py @@ -0,0 +1,52 @@ +# Generated by Django 5.1.2 on 2024-12-07 10:33 + +from django.db import migrations, models + +from treebeard.numconv import NumConv + +ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +STEPLEN = 7 + +def set_path_on_existing_documents(apps, schema_editor): + """ + Updates the `path` and `depth` fields for all existing Document records + to ensure valid materialized paths. + + This function assigns a unique `path` to each Document as a root node + + Note: After running this migration, we quickly modify the schema to make + the `path` field required as it should. + """ + Document = apps.get_model("core", "Document") + + # Iterate over all existing documents and make them root nodes + documents = Document.objects.order_by("created_at").values_list("id", flat=True) + numconv = NumConv(len(ALPHABET), ALPHABET) + + updates = [] + for i, pk in enumerate(documents): + key = numconv.int2str(i) + path = "{0}{1}".format( + ALPHABET[0] * (STEPLEN - len(key)), + key + ) + updates.append(Document(pk=pk, path=path, depth=1)) + + # Bulk update using the prepared updates list + Document.objects.bulk_update(updates, ['depth', 'path']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_add_tree_structure_to_documents'), + ] + + operations = [ + migrations.RunPython(set_path_on_existing_documents, reverse_code=migrations.RunPython.noop), + migrations.AlterField( + model_name='document', + name='path', + field=models.CharField(db_collation='C', max_length=252, unique=True), + ), + ] diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 1dc85739..d4319213 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -26,6 +26,7 @@ from django.utils.translation import gettext_lazy as _ from botocore.exceptions import ClientError from timezone_field import TimeZoneField +from treebeard.mp_tree import MP_Node logger = getLogger(__name__) @@ -366,7 +367,7 @@ class BaseAccess(BaseModel): } -class Document(BaseModel): +class Document(MP_Node, BaseModel): """Pad document carrying the content.""" title = models.CharField(_("title"), max_length=255, null=True, blank=True) @@ -388,9 +389,16 @@ class Document(BaseModel): _content = None + # Tree structure + alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + steplen = 7 # nb siblings max: 3,521,614,606,208 + node_order_by = [] # Manual ordering + + path = models.CharField(max_length=7 * 36, unique=True, db_collation="C") + class Meta: db_table = "impress_document" - ordering = ("title",) + ordering = ("path",) verbose_name = _("Document") verbose_name_plural = _("Documents") diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index 8ddaa018..598e5d3f 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -34,20 +34,18 @@ def test_models_documents_id_unique(): def test_models_documents_creator_required(): """No field should be required on the Document model.""" - models.Document.objects.create() + models.Document.add_root() def test_models_documents_title_null(): """The "title" field can be null.""" - document = models.Document.objects.create( - title=None, creator=factories.UserFactory() - ) + document = models.Document.add_root(title=None, creator=factories.UserFactory()) assert document.title is None def test_models_documents_title_empty(): """The "title" field can be empty.""" - document = models.Document.objects.create(title="", creator=factories.UserFactory()) + document = models.Document.add_root(title="", creator=factories.UserFactory()) assert document.title == "" @@ -67,6 +65,22 @@ def test_models_documents_file_key(): assert document.file_key == "9531a5f1-42b1-496c-b3f4-1c09ed139b3c/file" +def test_models_documents_tree_alphabet(): + """Test the creation of documents with treebeard methods.""" + models.Document.load_bulk( + [ + { + "data": { + "title": f"document-{i}", + } + } + for i in range(len(models.Document.alphabet) * 2) + ] + ) + + assert models.Document.objects.count() == 124 + + # get_abilities diff --git a/src/backend/demo/management/commands/create_demo.py b/src/backend/demo/management/commands/create_demo.py index 4ac9efc7..d07df613 100644 --- a/src/backend/demo/management/commands/create_demo.py +++ b/src/backend/demo/management/commands/create_demo.py @@ -135,9 +135,14 @@ def create_demo(stdout): users_ids = list(models.User.objects.values_list("id", flat=True)) with Timeit(stdout, "Creating documents"): - for _ in range(defaults.NB_OBJECTS["docs"]): + for i in range(defaults.NB_OBJECTS["docs"]): + # pylint: disable=protected-access + key = models.Document._int2str(i) # noqa: SLF001 + padding = models.Document.alphabet[0] * (models.Document.steplen - len(key)) queue.push( models.Document( + depth=1, + path=f"{padding}{key}", creator_id=random.choice(users_ids), title=fake.sentence(nb_words=4), link_reach=models.LinkReachChoices.AUTHENTICATED diff --git a/src/backend/impress/settings.py b/src/backend/impress/settings.py index df1cd39b..3e82a702 100755 --- a/src/backend/impress/settings.py +++ b/src/backend/impress/settings.py @@ -299,6 +299,7 @@ class Base(Configuration): "dockerflow.django", "rest_framework", "parler", + "treebeard", "easy_thumbnails", # Django "django.contrib.admin", diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index f470b9ae..98720821 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ "django-storages[s3]==1.14.4", "django-timezone-field>=5.1", "django==5.1.5", + "django-treebeard==4.7.1", "djangorestframework==3.15.2", "drf_spectacular==0.28.0", "dockerflow==2024.4.2", From 9a12452c26dc993ff151cd4ca1895dc3d3a98070 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Mon, 16 Dec 2024 20:13:12 +0100 Subject: [PATCH 04/22] =?UTF-8?q?=F0=9F=9A=9A(backend)=20split=20test=20fi?= =?UTF-8?q?les=20to=20make=20place=20for=20tests=20on=20tree=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test_api_documents_list file was getting too long. We can extract tests on filters and ordering. --- .../documents/test_api_documents_list.py | 361 ----------------- .../test_api_documents_list_filters.py | 374 ++++++++++++++++++ 2 files changed, 374 insertions(+), 361 deletions(-) create mode 100644 src/backend/core/tests/documents/test_api_documents_list_filters.py diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 8793b34f..727ae266 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -2,10 +2,7 @@ Tests for Documents API endpoint in impress's core app: list """ -import operator -import random from unittest import mock -from urllib.parse import urlencode import pytest from faker import Faker @@ -314,361 +311,3 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries assert result["is_favorite"] is True else: assert result["is_favorite"] is False - - -def test_api_documents_list_filter_and_access_rights(): - """Filtering on querystring parameters should respect access rights.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - other_user = factories.UserFactory() - - def random_favorited_by(): - return random.choice([[], [user], [other_user]]) - - # Documents that should be listed to this user - listed_documents = [ - factories.DocumentFactory( - link_reach="public", - link_traces=[user], - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ), - factories.DocumentFactory( - link_reach="authenticated", - link_traces=[user], - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ), - factories.DocumentFactory( - link_reach="restricted", - users=[user], - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ), - ] - listed_ids = [str(doc.id) for doc in listed_documents] - word_list = [word for doc in listed_documents for word in doc.title.split(" ")] - - # Documents that should not be listed to this user - factories.DocumentFactory( - link_reach="public", - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ) - factories.DocumentFactory( - link_reach="authenticated", - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ) - factories.DocumentFactory( - link_reach="restricted", - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ) - factories.DocumentFactory( - link_reach="restricted", - link_traces=[user], - favorited_by=random_favorited_by(), - creator=random.choice([user, other_user]), - ) - - filters = { - "link_reach": random.choice([None, *models.LinkReachChoices.values]), - "title": random.choice([None, *word_list]), - "favorite": random.choice([None, True, False]), - "creator": random.choice([None, user, other_user]), - "ordering": random.choice( - [ - None, - "created_at", - "-created_at", - "is_favorite", - "-is_favorite", - "nb_accesses", - "-nb_accesses", - "title", - "-title", - "updated_at", - "-updated_at", - ] - ), - } - query_params = {key: value for key, value in filters.items() if value is not None} - querystring = urlencode(query_params) - - response = client.get(f"/api/v1.0/documents/?{querystring:s}") - - assert response.status_code == 200 - results = response.json()["results"] - - # Ensure all documents in results respect expected access rights - for result in results: - assert result["id"] in listed_ids - - -# Filters: ordering - - -def test_api_documents_list_ordering_default(): - """Documents should be ordered by descending "updated_at" by default""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(5, users=[user]) - - response = client.get("/api/v1.0/documents/") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 5 - - # Check that results are sorted by descending "updated_at" as expected - for i in range(4): - assert operator.ge(results[i]["updated_at"], results[i + 1]["updated_at"]) - - -def test_api_documents_list_ordering_by_fields(): - """It should be possible to order by several fields""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(5, users=[user]) - - for parameter in [ - "created_at", - "-created_at", - "is_favorite", - "-is_favorite", - "nb_accesses", - "-nb_accesses", - "title", - "-title", - "updated_at", - "-updated_at", - ]: - is_descending = parameter.startswith("-") - field = parameter.lstrip("-") - querystring = f"?ordering={parameter}" - - response = client.get(f"/api/v1.0/documents/{querystring:s}") - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 5 - - # Check that results are sorted by the field in querystring as expected - compare = operator.ge if is_descending else operator.le - for i in range(4): - assert compare(results[i][field], results[i + 1][field]) - - -# Filters: is_creator_me - - -def test_api_documents_list_filter_is_creator_me_true(): - """ - Authenticated users should be able to filter documents they created. - """ - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], creator=user) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_creator_me=true") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 3 - - # Ensure all results are created by the current user - for result in results: - assert result["creator"] == str(user.id) - - -def test_api_documents_list_filter_is_creator_me_false(): - """ - Authenticated users should be able to filter documents created by others. - """ - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], creator=user) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_creator_me=false") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 2 - - # Ensure all results are created by other users - for result in results: - assert result["creator"] != str(user.id) - - -def test_api_documents_list_filter_is_creator_me_invalid(): - """Filtering with an invalid `is_creator_me` value should do nothing.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], creator=user) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_creator_me=invalid") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 5 - - -# Filters: is_favorite - - -def test_api_documents_list_filter_is_favorite_true(): - """ - Authenticated users should be able to filter documents they marked as favorite. - """ - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_favorite=true") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 3 - - # Ensure all results are marked as favorite by the current user - for result in results: - assert result["is_favorite"] is True - - -def test_api_documents_list_filter_is_favorite_false(): - """ - Authenticated users should be able to filter documents they didn't mark as favorite. - """ - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_favorite=false") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 2 - - # Ensure all results are not marked as favorite by the current user - for result in results: - assert result["is_favorite"] is False - - -def test_api_documents_list_filter_is_favorite_invalid(): - """Filtering with an invalid `is_favorite` value should do nothing.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) - factories.DocumentFactory.create_batch(2, users=[user]) - - response = client.get("/api/v1.0/documents/?is_favorite=invalid") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == 5 - - -# Filters: link_reach - - -@pytest.mark.parametrize("reach", models.LinkReachChoices.values) -def test_api_documents_list_filter_link_reach(reach): - """Authenticated users should be able to filter documents by link reach.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(5, users=[user]) - - response = client.get(f"/api/v1.0/documents/?link_reach={reach:s}") - - assert response.status_code == 200 - results = response.json()["results"] - - # Ensure all results have the chosen link reach - for result in results: - assert result["link_reach"] == reach - - -def test_api_documents_list_filter_link_reach_invalid(): - """Filtering with an invalid `link_reach` value should raise an error.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user]) - - response = client.get("/api/v1.0/documents/?link_reach=invalid") - - assert response.status_code == 400 - assert response.json() == { - "link_reach": [ - "Select a valid choice. invalid is not one of the available choices." - ] - } - - -# Filters: title - - -@pytest.mark.parametrize( - "query,nb_results", - [ - ("Project Alpha", 1), # Exact match - ("project", 2), # Partial match (case-insensitive) - ("Guide", 1), # Word match within a title - ("Special", 0), # No match (nonexistent keyword) - ("2024", 2), # Match by numeric keyword - ("", 5), # Empty string - ], -) -def test_api_documents_list_filter_title(query, nb_results): - """Authenticated users should be able to search documents by their title.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - # Create documents with predefined titles - titles = [ - "Project Alpha Documentation", - "Project Beta Overview", - "User Guide", - "Financial Report 2024", - "Annual Review 2024", - ] - for title in titles: - factories.DocumentFactory(title=title, users=[user]) - - # Perform the search query - response = client.get(f"/api/v1.0/documents/?title={query:s}") - - assert response.status_code == 200 - results = response.json()["results"] - assert len(results) == nb_results - - # Ensure all results contain the query in their title - for result in results: - assert query.lower().strip() in result["title"].lower() diff --git a/src/backend/core/tests/documents/test_api_documents_list_filters.py b/src/backend/core/tests/documents/test_api_documents_list_filters.py new file mode 100644 index 00000000..659c3f08 --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_list_filters.py @@ -0,0 +1,374 @@ +""" +Tests for Documents API endpoint in impress's core app: list +""" + +import operator +import random +from urllib.parse import urlencode + +import pytest +from faker import Faker +from rest_framework.test import APIClient + +from core import factories, models + +fake = Faker() +pytestmark = pytest.mark.django_db + + +def test_api_documents_list_filter_and_access_rights(): + """Filtering on querystring parameters should respect access rights.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + other_user = factories.UserFactory() + + def random_favorited_by(): + return random.choice([[], [user], [other_user]]) + + # Documents that should be listed to this user + listed_documents = [ + factories.DocumentFactory( + link_reach="public", + link_traces=[user], + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ), + factories.DocumentFactory( + link_reach="authenticated", + link_traces=[user], + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ), + factories.DocumentFactory( + link_reach="restricted", + users=[user], + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ), + ] + listed_ids = [str(doc.id) for doc in listed_documents] + word_list = [word for doc in listed_documents for word in doc.title.split(" ")] + + # Documents that should not be listed to this user + factories.DocumentFactory( + link_reach="public", + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ) + factories.DocumentFactory( + link_reach="authenticated", + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ) + factories.DocumentFactory( + link_reach="restricted", + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ) + factories.DocumentFactory( + link_reach="restricted", + link_traces=[user], + favorited_by=random_favorited_by(), + creator=random.choice([user, other_user]), + ) + + filters = { + "link_reach": random.choice([None, *models.LinkReachChoices.values]), + "title": random.choice([None, *word_list]), + "favorite": random.choice([None, True, False]), + "creator": random.choice([None, user, other_user]), + "ordering": random.choice( + [ + None, + "created_at", + "-created_at", + "is_favorite", + "-is_favorite", + "nb_accesses", + "-nb_accesses", + "title", + "-title", + "updated_at", + "-updated_at", + ] + ), + } + query_params = {key: value for key, value in filters.items() if value is not None} + querystring = urlencode(query_params) + + response = client.get(f"/api/v1.0/documents/?{querystring:s}") + + assert response.status_code == 200 + results = response.json()["results"] + + # Ensure all documents in results respect expected access rights + for result in results: + assert result["id"] in listed_ids + + +# Filters: ordering + + +def test_api_documents_list_ordering_default(): + """Documents should be ordered by descending "updated_at" by default""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(5, users=[user]) + + response = client.get("/api/v1.0/documents/") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 5 + + # Check that results are sorted by descending "updated_at" as expected + for i in range(4): + assert operator.ge(results[i]["updated_at"], results[i + 1]["updated_at"]) + + +def test_api_documents_list_ordering_by_fields(): + """It should be possible to order by several fields""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(5, users=[user]) + + for parameter in [ + "created_at", + "-created_at", + "is_favorite", + "-is_favorite", + "nb_accesses", + "-nb_accesses", + "title", + "-title", + "updated_at", + "-updated_at", + ]: + is_descending = parameter.startswith("-") + field = parameter.lstrip("-") + querystring = f"?ordering={parameter}" + + response = client.get(f"/api/v1.0/documents/{querystring:s}") + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 5 + + # Check that results are sorted by the field in querystring as expected + compare = operator.ge if is_descending else operator.le + for i in range(4): + assert compare(results[i][field], results[i + 1][field]) + + +# Filters: is_creator_me + + +def test_api_documents_list_filter_is_creator_me_true(): + """ + Authenticated users should be able to filter documents they created. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], creator=user) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_creator_me=true") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 3 + + # Ensure all results are created by the current user + for result in results: + assert result["creator"] == str(user.id) + + +def test_api_documents_list_filter_is_creator_me_false(): + """ + Authenticated users should be able to filter documents created by others. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], creator=user) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_creator_me=false") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 2 + + # Ensure all results are created by other users + for result in results: + assert result["creator"] != str(user.id) + + +def test_api_documents_list_filter_is_creator_me_invalid(): + """Filtering with an invalid `is_creator_me` value should do nothing.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], creator=user) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_creator_me=invalid") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 5 + + +# Filters: is_favorite + + +def test_api_documents_list_filter_is_favorite_true(): + """ + Authenticated users should be able to filter documents they marked as favorite. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_favorite=true") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 3 + + # Ensure all results are marked as favorite by the current user + for result in results: + assert result["is_favorite"] is True + + +def test_api_documents_list_filter_is_favorite_false(): + """ + Authenticated users should be able to filter documents they didn't mark as favorite. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_favorite=false") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 2 + + # Ensure all results are not marked as favorite by the current user + for result in results: + assert result["is_favorite"] is False + + +def test_api_documents_list_filter_is_favorite_invalid(): + """Filtering with an invalid `is_favorite` value should do nothing.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user], favorited_by=[user]) + factories.DocumentFactory.create_batch(2, users=[user]) + + response = client.get("/api/v1.0/documents/?is_favorite=invalid") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 5 + + +# Filters: link_reach + + +@pytest.mark.parametrize("reach", models.LinkReachChoices.values) +def test_api_documents_list_filter_link_reach(reach): + """Authenticated users should be able to filter documents by link reach.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(5, users=[user]) + + response = client.get(f"/api/v1.0/documents/?link_reach={reach:s}") + + assert response.status_code == 200 + results = response.json()["results"] + + # Ensure all results have the chosen link reach + for result in results: + assert result["link_reach"] == reach + + +def test_api_documents_list_filter_link_reach_invalid(): + """Filtering with an invalid `link_reach` value should raise an error.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory.create_batch(3, users=[user]) + + response = client.get("/api/v1.0/documents/?link_reach=invalid") + + assert response.status_code == 400 + assert response.json() == { + "link_reach": [ + "Select a valid choice. invalid is not one of the available choices." + ] + } + + +# Filters: title + + +@pytest.mark.parametrize( + "query,nb_results", + [ + ("Project Alpha", 1), # Exact match + ("project", 2), # Partial match (case-insensitive) + ("Guide", 1), # Word match within a title + ("Special", 0), # No match (nonexistent keyword) + ("2024", 2), # Match by numeric keyword + ("", 5), # Empty string + ], +) +def test_api_documents_list_filter_title(query, nb_results): + """Authenticated users should be able to search documents by their title.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + # Create documents with predefined titles + titles = [ + "Project Alpha Documentation", + "Project Beta Overview", + "User Guide", + "Financial Report 2024", + "Annual Review 2024", + ] + for title in titles: + factories.DocumentFactory(title=title, users=[user]) + + # Perform the search query + response = client.get(f"/api/v1.0/documents/?title={query:s}") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == nb_results + + # Ensure all results contain the query in their title + for result in results: + assert query.lower().strip() in result["title"].lower() From 48662ceecb98babce7f5ae4286c08a0bdf840025 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Tue, 17 Dec 2024 07:35:09 +0100 Subject: [PATCH 05/22] =?UTF-8?q?=E2=9C=A8(backend)=20list=20only=20the=20?= =?UTF-8?q?first=20visible=20parent=20document=20for=20a=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we have a tree structure, we should only include parents of a visible subtree in list results. --- src/backend/core/api/viewsets.py | 20 +++++++++ .../documents/test_api_documents_list.py | 43 ++++++++++++++++--- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index b5359af5..052e2321 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -15,12 +15,14 @@ from django.db import models as db from django.db.models import ( Count, Exists, + F, OuterRef, Q, Subquery, Value, ) from django.db.models.expressions import RawSQL +from django.db.models.functions import Left, Length from django.http import Http404 import rest_framework as drf @@ -395,6 +397,24 @@ class DocumentViewSet( & ~db.Q(link_reach=models.LinkReachChoices.RESTRICTED) ) ) + + # Among the results, we may have documents that are ancestors/children of each other + # In this case we want to keep only the highest ancestor. Let's annotate, each document + # with the path of its highest ancestor within results so we can use it to filter + shortest_path = Subquery( + queryset.filter(path=Left(OuterRef("path"), Length("path"))) + .order_by("path") # Get the shortest (root) path + .values("path")[:1] + ) + queryset = queryset.annotate(root_path=shortest_path) + + # Filter documents based on their shortest path (root path) + queryset = queryset.filter( + root_path=F( + "path" + ) # Keep only documents who are the annotated highest ancestor + ) + else: queryset = queryset.none() diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 727ae266..93e35237 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -2,6 +2,7 @@ Tests for Documents API endpoint in impress's core app: list """ +import random from unittest import mock import pytest @@ -82,7 +83,7 @@ def test_api_documents_list_authenticated_direct(django_assert_num_queries): client = APIClient() client.force_login(user) - documents = [ + document1, document2 = [ access.document for access in factories.UserDocumentAccessFactory.create_batch(2, user=user) ] @@ -92,14 +93,29 @@ def test_api_documents_list_authenticated_direct(django_assert_num_queries): for role in models.LinkRoleChoices: factories.DocumentFactory(link_reach=reach, link_role=role) - expected_ids = {str(document.id) for document in documents} + # Children of visible documents should not get listed even with a specific access + factories.DocumentFactory(parent=document1) + + child1_with_access = factories.DocumentFactory(parent=document1) + factories.UserDocumentAccessFactory(user=user, document=child1_with_access) + + middle_document = factories.DocumentFactory(parent=document2) + child2_with_access = factories.DocumentFactory(parent=middle_document) + factories.UserDocumentAccessFactory(user=user, document=child2_with_access) + + # Children of hidden documents should get listed when visible by the logged-in user + hidden_root = factories.DocumentFactory() + child3_with_access = factories.DocumentFactory(parent=hidden_root) + factories.UserDocumentAccessFactory(user=user, document=child3_with_access) + + expected_ids = {str(document1.id), str(document2.id), str(child3_with_access.id)} with django_assert_num_queries(3): response = client.get("/api/v1.0/documents/") assert response.status_code == 200 results = response.json()["results"] - assert len(results) == 2 + assert len(results) == 3 results_id = {result["id"] for result in results} assert expected_ids == results_id @@ -183,12 +199,27 @@ def test_api_documents_list_authenticated_link_reach_public_or_authenticated( client = APIClient() client.force_login(user) - documents = [ + document1, document2 = [ factories.DocumentFactory(link_traces=[user], link_reach=reach) for reach in models.LinkReachChoices if reach != "restricted" ] - expected_ids = {str(document.id) for document in documents} + factories.DocumentFactory( + link_reach=random.choice(["public", "authenticated"]), + link_traces=[user], + parent=document1, + ) + + hidden_document = factories.DocumentFactory( + link_reach=random.choice(["public", "authenticated"]) + ) + visible_child = factories.DocumentFactory( + link_traces=[user], + link_reach=random.choice(["public", "authenticated"]), + parent=hidden_document, + ) + + expected_ids = {str(document1.id), str(document2.id), str(visible_child.id)} with django_assert_num_queries(3): response = client.get( @@ -197,7 +228,7 @@ def test_api_documents_list_authenticated_link_reach_public_or_authenticated( assert response.status_code == 200 results = response.json()["results"] - assert len(results) == 2 + assert len(results) == 3 results_id = {result["id"] for result in results} assert expected_ids == results_id From d073a9c9b353a9f5a2a2370b177efcada6a33375 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Tue, 17 Dec 2024 07:47:23 +0100 Subject: [PATCH 06/22] =?UTF-8?q?=E2=9C=A8(backend)=20retrieve=20&=20updat?= =?UTF-8?q?e=20a=20document=20taking=20into=20account=20ancestors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A document should inherit the access rights a user has on any of its ancestors. --- src/backend/core/api/serializers.py | 2 +- src/backend/core/api/viewsets.py | 48 ++-- src/backend/core/models.py | 79 ++++-- .../documents/test_api_document_versions.py | 144 ++++++++++ .../documents/test_api_documents_list.py | 15 +- .../documents/test_api_documents_retrieve.py | 258 +++++++++++++++++- .../documents/test_api_documents_update.py | 122 ++++----- 7 files changed, 544 insertions(+), 124 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 03a092d6..d280bde6 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -152,8 +152,8 @@ class ListDocumentSerializer(BaseResourceSerializer): model = models.Document fields = [ "id", - "abilities", "content", + "abilities", "created_at", "creator", "is_favorite", diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 052e2321..fb998be5 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -13,9 +13,9 @@ from django.core.exceptions import ValidationError from django.core.files.storage import default_storage from django.db import models as db from django.db.models import ( - Count, Exists, F, + Func, OuterRef, Q, Subquery, @@ -353,13 +353,22 @@ class DocumentViewSet( return serializers.ListDocumentSerializer return self.serializer_class - def get_queryset(self): - """Optimize queryset to include favorite status for the current user.""" - queryset = super().get_queryset() + def annotate_queryset(self, queryset): + """Annotate document queryset with favorite and number of accesses.""" user = self.request.user - # Annotate the number of accesses associated with each document - queryset = queryset.annotate(nb_accesses=Count("accesses", distinct=True)) + # Annotate the number of accesses taking into account ancestors + ancestor_accesses_query = ( + models.DocumentAccess.objects.filter( + document__path=Left(OuterRef("path"), Length("document__path")), + ) + .order_by() + .annotate(total_accesses=Func(Value("id"), function="COUNT")) + .values("total_accesses") + ) + + # Annotate with the number of accesses, default to 0 if no accesses exist + queryset = queryset.annotate(nb_accesses=Subquery(ancestor_accesses_query)) if not user.is_authenticated: # If the user is not authenticated, annotate `is_favorite` as False @@ -369,19 +378,13 @@ class DocumentViewSet( favorite_exists = models.DocumentFavorite.objects.filter( document_id=OuterRef("pk"), user=user ) - queryset = queryset.annotate(is_favorite=Exists(favorite_exists)) + return queryset.annotate(is_favorite=Exists(favorite_exists)) - # Annotate the queryset with the logged-in user roles - user_roles_query = ( - models.DocumentAccess.objects.filter( - Q(user=user) | Q(team__in=user.teams), - document_id=OuterRef("pk"), - ) - .values("document") - .annotate(roles_array=ArrayAgg("role")) - .values("roles_array") - ) - return queryset.annotate(user_roles=Subquery(user_roles_query)).distinct() + def get_queryset(self): + """Optimize queryset to include favorite status for the current user.""" + queryset = super().get_queryset() + queryset = self.annotate_queryset(queryset) + return queryset.distinct() def list(self, request, *args, **kwargs): """Restrict resources returned by the list endpoint""" @@ -504,8 +507,9 @@ class DocumentViewSet( # Users should not see version history dating from before they gained access to the # document. Filter to get the minimum access date for the logged-in user - access_queryset = document.accesses.filter( - db.Q(user=user) | db.Q(team__in=user.teams) + access_queryset = models.DocumentAccess.objects.filter( + db.Q(user=user) | db.Q(team__in=user.teams), + document__path=Left(Value(document.path), Length("document__path")), ).aggregate(min_date=db.Min("created_at")) # Handle the case where the user has no accesses @@ -543,10 +547,12 @@ class DocumentViewSet( user = request.user min_datetime = min( access.created_at - for access in document.accesses.filter( + for access in models.DocumentAccess.objects.filter( db.Q(user=user) | db.Q(team__in=user.teams), + document__path=Left(Value(document.path), Length("document__path")), ) ) + if response["LastModified"] < min_datetime: raise Http404 diff --git a/src/backend/core/models.py b/src/backend/core/models.py index d4319213..2994b804 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -18,6 +18,10 @@ from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.core.mail import send_mail from django.db import models +from django.db.models.functions import Left, Length +from django.http import FileResponse +from django.template.base import Template as DjangoTemplate +from django.template.context import Context from django.template.loader import render_to_string from django.utils import timezone from django.utils.functional import cached_property, lazy @@ -31,23 +35,6 @@ from treebeard.mp_tree import MP_Node logger = getLogger(__name__) -def get_resource_roles(resource, user): - """Compute the roles a user has on a resource.""" - if not user.is_authenticated: - return [] - - try: - roles = resource.user_roles or [] - except AttributeError: - try: - roles = resource.accesses.filter( - models.Q(user=user) | models.Q(team__in=user.teams), - ).values_list("role", flat=True) - except (models.ObjectDoesNotExist, IndexError): - roles = [] - return roles - - class LinkRoleChoices(models.TextChoices): """Defines the possible roles a link can offer on a document.""" @@ -539,11 +526,30 @@ class Document(MP_Node, BaseModel): Bucket=default_storage.bucket_name, Key=self.file_key, VersionId=version_id ) + def get_roles(self, user): + """Return the roles a user has on a document.""" + if not user.is_authenticated: + return [] + + try: + roles = self.user_roles or [] + except AttributeError: + try: + roles = DocumentAccess.objects.filter( + models.Q(user=user) | models.Q(team__in=user.teams), + document__path=Left( + models.Value(self.path), Length("document__path") + ), + ).values_list("role", flat=True) + except (models.ObjectDoesNotExist, IndexError): + roles = [] + return roles + def get_abilities(self, user): """ Compute and return abilities for a given user on the document. """ - roles = set(get_resource_roles(self, user)) + roles = set(self.get_roles(user)) # Compute version roles before adding link roles because we don't # want anonymous users to access versions (we wouldn't know from @@ -551,11 +557,20 @@ class Document(MP_Node, BaseModel): # Anonymous users should also not see document accesses has_role = bool(roles) - # Add role provided by the document link - if self.link_reach == LinkReachChoices.PUBLIC or ( - self.link_reach == LinkReachChoices.AUTHENTICATED and user.is_authenticated - ): - roles.add(self.link_role) + # Add roles provided by the document link, taking into account its ancestors + link_reaches = list(self.get_ancestors().values("link_reach", "link_role")) + link_reaches.append( + {"link_reach": self.link_reach, "link_role": self.link_role} + ) + + for lr in link_reaches: + if lr["link_reach"] == LinkReachChoices.PUBLIC: + roles.add(lr["link_role"]) + + if user.is_authenticated: + for lr in link_reaches: + if lr["link_reach"] == LinkReachChoices.AUTHENTICATED: + roles.add(lr["link_role"]) is_owner_or_admin = bool( roles.intersection({RoleChoices.OWNER, RoleChoices.ADMIN}) @@ -772,11 +787,27 @@ class Template(BaseModel): def __str__(self): return self.title + def get_roles(self, user): + """Return the roles a user has on a resource.""" + if not user.is_authenticated: + return [] + + try: + roles = self.user_roles or [] + except AttributeError: + try: + roles = self.accesses.filter( + models.Q(user=user) | models.Q(team__in=user.teams), + ).values_list("role", flat=True) + except (models.ObjectDoesNotExist, IndexError): + roles = [] + return roles + def get_abilities(self, user): """ Compute and return abilities for a given user on the template. """ - roles = get_resource_roles(self, user) + roles = self.get_roles(user) is_owner_or_admin = bool( set(roles).intersection({RoleChoices.OWNER, RoleChoices.ADMIN}) ) diff --git a/src/backend/core/tests/documents/test_api_document_versions.py b/src/backend/core/tests/documents/test_api_document_versions.py index e91012b2..83344259 100644 --- a/src/backend/core/tests/documents/test_api_document_versions.py +++ b/src/backend/core/tests/documents/test_api_document_versions.py @@ -185,6 +185,82 @@ def test_api_document_versions_list_authenticated_related_pagination( assert content["versions"][0]["version_id"] == all_version_ids[2] +@pytest.mark.parametrize("via", VIA) +def test_api_document_versions_list_authenticated_related_pagination_parent( + via, mock_user_teams +): + """ + When a user gains access to a document's versions via an ancestor, the date of access + to the parent should be used to filter versions that were created prior to the + user gaining access to the document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory() + parent = factories.DocumentFactory(parent=grand_parent) + document = factories.DocumentFactory(parent=parent) + for i in range(3): + document.content = f"before {i:d}" + document.save() + + if via == USER: + models.DocumentAccess.objects.create( + document=grand_parent, + user=user, + role=random.choice(models.RoleChoices.choices)[0], + ) + elif via == TEAM: + mock_user_teams.return_value = ["lasuite", "unknown"] + models.DocumentAccess.objects.create( + document=grand_parent, + team="lasuite", + role=random.choice(models.RoleChoices.choices)[0], + ) + + for i in range(4): + document.content = f"after {i:d}" + document.save() + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/", + ) + + content = response.json() + assert content["is_truncated"] is False + # The current version is not listed + assert content["count"] == 3 + assert content["next_version_id_marker"] == "" + all_version_ids = [version["version_id"] for version in content["versions"]] + + # - set page size + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/?page_size=2", + ) + + content = response.json() + assert content["count"] == 2 + assert content["is_truncated"] is True + marker = content["next_version_id_marker"] + assert marker == all_version_ids[1] + assert [ + version["version_id"] for version in content["versions"] + ] == all_version_ids[:2] + + # - get page 2 + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/?page_size=2&version_id={marker:s}", + ) + + content = response.json() + assert content["count"] == 1 + assert content["is_truncated"] is False + assert content["next_version_id_marker"] == "" + assert content["versions"][0]["version_id"] == all_version_ids[2] + + def test_api_document_versions_list_exceeds_max_page_size(): """Page size should not exceed the limit set on the serializer""" user = factories.UserFactory() @@ -314,6 +390,74 @@ def test_api_document_versions_retrieve_authenticated_related(via, mock_user_tea assert response.json()["content"] == "new content 1" +@pytest.mark.parametrize("via", VIA) +def test_api_document_versions_retrieve_authenticated_related_parent( + via, mock_user_teams +): + """ + A user who gains access to a document's versions via one of its ancestors, should be able to + retrieve the document versions. The date of access to the parent should be used to filter + versions that were created prior to the user gaining access to the document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory() + parent = factories.DocumentFactory(parent=grand_parent) + document = factories.DocumentFactory(parent=parent) + document.content = "new content" + document.save() + + assert len(document.get_versions_slice()["versions"]) == 1 + version_id = document.get_versions_slice()["versions"][0]["version_id"] + + if via == USER: + factories.UserDocumentAccessFactory(document=grand_parent, user=user) + elif via == TEAM: + mock_user_teams.return_value = ["lasuite", "unknown"] + factories.TeamDocumentAccessFactory(document=grand_parent, team="lasuite") + + time.sleep(1) # minio stores datetimes with the precision of a second + + # Versions created before the document was shared should not be seen by the user + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/{version_id:s}/", + ) + + assert response.status_code == 404 + + # Create a new version should not make it available to the user because + # only the current version is available to the user but it is excluded + # from the list + document.content = "new content 1" + document.save() + + assert len(document.get_versions_slice()["versions"]) == 2 + version_id = document.get_versions_slice()["versions"][0]["version_id"] + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/{version_id:s}/", + ) + + assert response.status_code == 404 + + # Adding one more version should make the previous version available to the user + document.content = "new content 2" + document.save() + + assert len(document.get_versions_slice()["versions"]) == 3 + version_id = document.get_versions_slice()["versions"][0]["version_id"] + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/versions/{version_id:s}/", + ) + + assert response.status_code == 200 + assert response.json()["content"] == "new content 1" + + def test_api_document_versions_create_anonymous(): """Anonymous users should not be allowed to create document versions.""" document = factories.DocumentFactory() diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 93e35237..8549eaf0 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -59,8 +59,8 @@ def test_api_documents_list_format(): assert len(results) == 1 assert results[0] == { "id": str(document.id), - "abilities": document.get_abilities(user), "content": document.content, + "abilities": document.get_abilities(user), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "is_favorite": True, @@ -79,7 +79,6 @@ def test_api_documents_list_authenticated_direct(django_assert_num_queries): than restricted. """ user = factories.UserFactory() - client = APIClient() client.force_login(user) @@ -110,7 +109,7 @@ def test_api_documents_list_authenticated_direct(django_assert_num_queries): expected_ids = {str(document1.id), str(document2.id), str(child3_with_access.id)} - with django_assert_num_queries(3): + with django_assert_num_queries(7): response = client.get("/api/v1.0/documents/") assert response.status_code == 200 @@ -145,7 +144,7 @@ def test_api_documents_list_authenticated_via_team( expected_ids = {str(document.id) for document in documents_team1 + documents_team2} - with django_assert_num_queries(3): + with django_assert_num_queries(8): response = client.get("/api/v1.0/documents/") assert response.status_code == 200 @@ -174,7 +173,7 @@ def test_api_documents_list_authenticated_link_reach_restricted( other_document = factories.DocumentFactory(link_reach="public") models.LinkTrace.objects.create(document=other_document, user=user) - with django_assert_num_queries(3): + with django_assert_num_queries(4): response = client.get( "/api/v1.0/documents/", ) @@ -221,7 +220,7 @@ def test_api_documents_list_authenticated_link_reach_public_or_authenticated( expected_ids = {str(document1.id), str(document2.id), str(visible_child.id)} - with django_assert_num_queries(3): + with django_assert_num_queries(7): response = client.get( "/api/v1.0/documents/", ) @@ -315,7 +314,7 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries factories.DocumentFactory.create_batch(2, users=[user]) url = "/api/v1.0/documents/" - with django_assert_num_queries(3): + with django_assert_num_queries(8): response = client.get(url) assert response.status_code == 200 @@ -328,7 +327,7 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries for document in special_documents: models.DocumentFavorite.objects.create(document=document, user=user) - with django_assert_num_queries(3): + with django_assert_num_queries(8): response = client.get(url) assert response.status_code == 200 diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 4307ed69..370e30fe 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -2,16 +2,17 @@ Tests for Documents API endpoint in impress's core app: retrieve """ +import random + import pytest from rest_framework.test import APIClient from core import factories, models -from core.api import serializers pytestmark = pytest.mark.django_db -def test_api_documents_retrieve_anonymous_public(): +def test_api_documents_retrieve_anonymous_public_standalone(): """Anonymous users should be allowed to retrieve public documents.""" document = factories.DocumentFactory(link_reach="public") @@ -52,6 +53,70 @@ def test_api_documents_retrieve_anonymous_public(): } +def test_api_documents_retrieve_anonymous_public_parent(): + """Anonymous users should be allowed to retrieve a document who has a public ancestor.""" + grand_parent = factories.DocumentFactory(link_reach="public") + parent = factories.DocumentFactory( + parent=grand_parent, link_reach=random.choice(["authenticated", "restricted"]) + ) + document = factories.DocumentFactory( + link_reach=random.choice(["authenticated", "restricted"]), parent=parent + ) + + response = APIClient().get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + assert response.json() == { + "id": str(document.id), + "abilities": { + "accesses_manage": False, + "accesses_view": False, + "ai_transform": grand_parent.link_role == "editor", + "ai_translate": grand_parent.link_role == "editor", + "attachment_upload": grand_parent.link_role == "editor", + "collaboration_auth": True, + "destroy": False, + # Anonymous user can't favorite a document even with read access + "favorite": False, + "invite_owner": False, + "link_configuration": False, + "media_auth": True, + "partial_update": grand_parent.link_role == "editor", + "retrieve": True, + "update": grand_parent.link_role == "editor", + "versions_destroy": False, + "versions_list": False, + "versions_retrieve": False, + }, + "content": document.content, + "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(document.creator.id), + "is_favorite": False, + "link_reach": document.link_reach, + "link_role": document.link_role, + "nb_accesses": 0, + "title": document.title, + "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + } + + +def test_api_documents_retrieve_anonymous_public_child(): + """ + Anonymous users having access to a document should not gain access to a parent document. + """ + document = factories.DocumentFactory( + link_reach=random.choice(["authenticated", "restricted"]) + ) + factories.DocumentFactory(link_reach="public", parent=document) + + response = APIClient().get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 401 + assert response.json() == { + "detail": "Authentication credentials were not provided." + } + + @pytest.mark.parametrize("reach", ["restricted", "authenticated"]) def test_api_documents_retrieve_anonymous_restricted_or_authenticated(reach): """Anonymous users should not be able to retrieve a document that is not public.""" @@ -68,8 +133,8 @@ def test_api_documents_retrieve_anonymous_restricted_or_authenticated(reach): @pytest.mark.parametrize("reach", ["public", "authenticated"]) def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated(reach): """ - Authenticated users should be able to retrieve a public document to which they are - not related. + Authenticated users should be able to retrieve a public/authenticated document to + which they are not related. """ user = factories.UserFactory() @@ -118,6 +183,78 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( ) +@pytest.mark.parametrize("reach", ["public", "authenticated"]) +def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(reach): + """ + Authenticated users should be allowed to retrieve a document who has a public or + authenticated ancestor. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory(link_reach=reach) + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(link_reach="restricted", parent=parent) + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + assert response.json() == { + "id": str(document.id), + "abilities": { + "accesses_manage": False, + "accesses_view": False, + "ai_transform": grand_parent.link_role == "editor", + "ai_translate": grand_parent.link_role == "editor", + "attachment_upload": grand_parent.link_role == "editor", + "collaboration_auth": True, + "destroy": False, + "favorite": True, + "invite_owner": False, + "link_configuration": False, + "media_auth": True, + "partial_update": grand_parent.link_role == "editor", + "retrieve": True, + "update": grand_parent.link_role == "editor", + "versions_destroy": False, + "versions_list": False, + "versions_retrieve": False, + }, + "content": document.content, + "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(document.creator.id), + "is_favorite": False, + "link_reach": document.link_reach, + "link_role": document.link_role, + "nb_accesses": 0, + "title": document.title, + "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + } + + +@pytest.mark.parametrize("reach", ["public", "authenticated"]) +def test_api_documents_retrieve_authenticated_public_or_authenticated_child(reach): + """ + Authenticated users having access to a document should not gain access to a parent document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + factories.DocumentFactory(link_reach=reach, parent=document) + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + @pytest.mark.parametrize("reach", ["public", "authenticated"]) def test_api_documents_retrieve_authenticated_trace_twice(reach): """ @@ -180,9 +317,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): document = factories.DocumentFactory() factories.UserDocumentAccessFactory(document=document, user=user) - access2 = factories.UserDocumentAccessFactory(document=document) - serializers.UserSerializer(instance=user) - serializers.UserSerializer(instance=access2.user) + factories.UserDocumentAccessFactory(document=document) response = client.get( f"/api/v1.0/documents/{document.id!s}/", @@ -203,6 +338,115 @@ def test_api_documents_retrieve_authenticated_related_direct(): } +def test_api_documents_retrieve_authenticated_related_parent(): + """ + Authenticated users should be allowed to retrieve a document if they are related + to one of its ancestors whatever the role. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory(link_reach="restricted") + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + + access = factories.UserDocumentAccessFactory(document=grand_parent, user=user) + factories.UserDocumentAccessFactory(document=grand_parent) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/", + ) + assert response.status_code == 200 + assert response.json() == { + "id": str(document.id), + "abilities": { + "accesses_manage": access.role in ["administrator", "owner"], + "accesses_view": True, + "ai_transform": access.role != "reader", + "ai_translate": access.role != "reader", + "attachment_upload": access.role != "reader", + "collaboration_auth": True, + "destroy": access.role == "owner", + "favorite": True, + "invite_owner": access.role == "owner", + "link_configuration": access.role in ["administrator", "owner"], + "media_auth": True, + "partial_update": access.role != "reader", + "retrieve": True, + "update": access.role != "reader", + "versions_destroy": access.role in ["administrator", "owner"], + "versions_list": True, + "versions_retrieve": True, + }, + "content": document.content, + "creator": str(document.creator.id), + "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "is_favorite": False, + "link_reach": "restricted", + "link_role": document.link_role, + "nb_accesses": 2, + "title": document.title, + "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + } + + +def test_api_documents_retrieve_authenticated_related_nb_accesses(): + """Validate computation of number of accesses.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory(link_reach="restricted") + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + + factories.UserDocumentAccessFactory(document=grand_parent, user=user) + factories.UserDocumentAccessFactory(document=parent) + factories.UserDocumentAccessFactory(document=document) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/", + ) + assert response.status_code == 200 + assert response.json()["nb_accesses"] == 3 + + factories.UserDocumentAccessFactory(document=grand_parent) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/", + ) + assert response.status_code == 200 + assert response.json()["nb_accesses"] == 4 + + +def test_api_documents_retrieve_authenticated_related_child(): + """ + Authenticated users should not be allowed to retrieve a document as a result of being + related to one of its children. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + child = factories.DocumentFactory(parent=document) + + factories.UserDocumentAccessFactory(document=child, user=user) + factories.UserDocumentAccessFactory(document=document) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/", + ) + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + def test_api_documents_retrieve_authenticated_related_team_none(mock_user_teams): """ Authenticated users should not be able to retrieve a restricted document related to diff --git a/src/backend/core/tests/documents/test_api_documents_update.py b/src/backend/core/tests/documents/test_api_documents_update.py index 3724af38..02b8dcf2 100644 --- a/src/backend/core/tests/documents/test_api_documents_update.py +++ b/src/backend/core/tests/documents/test_api_documents_update.py @@ -16,6 +16,7 @@ from core.tests.conftest import TEAM, USER, VIA pytestmark = pytest.mark.django_db +@pytest.mark.parametrize("via_parent", [True, False]) @pytest.mark.parametrize( "reach, role", [ @@ -26,12 +27,18 @@ pytestmark = pytest.mark.django_db ("public", "reader"), ], ) -def test_api_documents_update_anonymous_forbidden(reach, role): +def test_api_documents_update_anonymous_forbidden(reach, role, via_parent): """ Anonymous users should not be allowed to update a document when link configuration does not allow it. """ - document = factories.DocumentFactory(link_reach=reach, link_role=role) + if via_parent: + grand_parent = factories.DocumentFactory(link_reach=reach, link_role=role) + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + else: + document = factories.DocumentFactory(link_reach=reach, link_role=role) + old_document_values = serializers.DocumentSerializer(instance=document).data new_document_values = serializers.DocumentSerializer( @@ -52,6 +59,7 @@ def test_api_documents_update_anonymous_forbidden(reach, role): assert document_values == old_document_values +@pytest.mark.parametrize("via_parent", [True, False]) @pytest.mark.parametrize( "reach,role", [ @@ -61,7 +69,9 @@ def test_api_documents_update_anonymous_forbidden(reach, role): ("restricted", "editor"), ], ) -def test_api_documents_update_authenticated_unrelated_forbidden(reach, role): +def test_api_documents_update_authenticated_unrelated_forbidden( + reach, role, via_parent +): """ Authenticated users should not be allowed to update a document to which they are not related if the link configuration does not allow it. @@ -71,7 +81,12 @@ def test_api_documents_update_authenticated_unrelated_forbidden(reach, role): client = APIClient() client.force_login(user) - document = factories.DocumentFactory(link_reach=reach, link_role=role) + if via_parent: + grand_parent = factories.DocumentFactory(link_reach=reach, link_role=role) + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + else: + document = factories.DocumentFactory(link_reach=reach, link_role=role) old_document_values = serializers.DocumentSerializer(instance=document).data new_document_values = serializers.DocumentSerializer( @@ -93,6 +108,7 @@ def test_api_documents_update_authenticated_unrelated_forbidden(reach, role): assert document_values == old_document_values +@pytest.mark.parametrize("via_parent", [True, False]) @pytest.mark.parametrize( "is_authenticated,reach,role", [ @@ -102,10 +118,10 @@ def test_api_documents_update_authenticated_unrelated_forbidden(reach, role): ], ) def test_api_documents_update_anonymous_or_authenticated_unrelated( - is_authenticated, reach, role + is_authenticated, reach, role, via_parent ): """ - Authenticated users should be able to update a document to which + Anonymous and authenticated users should be able to update a document to which they are not related if the link configuration allows it. """ client = APIClient() @@ -116,7 +132,12 @@ def test_api_documents_update_anonymous_or_authenticated_unrelated( else: user = AnonymousUser() - document = factories.DocumentFactory(link_reach=reach, link_role=role) + if via_parent: + grand_parent = factories.DocumentFactory(link_reach=reach, link_role=role) + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + else: + document = factories.DocumentFactory(link_reach=reach, link_role=role) old_document_values = serializers.DocumentSerializer(instance=document).data new_document_values = serializers.DocumentSerializer( @@ -147,24 +168,34 @@ def test_api_documents_update_anonymous_or_authenticated_unrelated( assert value == new_document_values[key] +@pytest.mark.parametrize("via_parent", [True, False]) @pytest.mark.parametrize("via", VIA) -def test_api_documents_update_authenticated_reader(via, mock_user_teams): +def test_api_documents_update_authenticated_reader(via, via_parent, mock_user_teams): """ - Users who are reader of a document but not administrators should - not be allowed to update it. + Users who are reader of a document should not be allowed to update it. """ user = factories.UserFactory(with_owned_document=True) client = APIClient() client.force_login(user) - document = factories.DocumentFactory(link_role="reader") + if via_parent: + grand_parent = factories.DocumentFactory(link_reach="restricted") + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + access_document = grand_parent + else: + document = factories.DocumentFactory(link_reach="restricted") + access_document = document + if via == USER: - factories.UserDocumentAccessFactory(document=document, user=user, role="reader") + factories.UserDocumentAccessFactory( + document=access_document, user=user, role="reader" + ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] factories.TeamDocumentAccessFactory( - document=document, team="lasuite", role="reader" + document=access_document, team="lasuite", role="reader" ) old_document_values = serializers.DocumentSerializer(instance=document).data @@ -188,10 +219,11 @@ def test_api_documents_update_authenticated_reader(via, mock_user_teams): assert document_values == old_document_values +@pytest.mark.parametrize("via_parent", [True, False]) @pytest.mark.parametrize("role", ["editor", "administrator", "owner"]) @pytest.mark.parametrize("via", VIA) def test_api_documents_update_authenticated_editor_administrator_or_owner( - via, role, mock_user_teams + via, role, via_parent, mock_user_teams ): """A user who is editor, administrator or owner of a document should be allowed to update it.""" user = factories.UserFactory(with_owned_document=True) @@ -199,13 +231,23 @@ def test_api_documents_update_authenticated_editor_administrator_or_owner( client = APIClient() client.force_login(user) - document = factories.DocumentFactory() + if via_parent: + grand_parent = factories.DocumentFactory(link_reach="restricted") + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + access_document = grand_parent + else: + document = factories.DocumentFactory(link_reach="restricted") + access_document = document + if via == USER: - factories.UserDocumentAccessFactory(document=document, user=user, role=role) + factories.UserDocumentAccessFactory( + document=access_document, user=user, role=role + ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] factories.TeamDocumentAccessFactory( - document=document, team="lasuite", role=role + document=access_document, team="lasuite", role=role ) old_document_values = serializers.DocumentSerializer(instance=document).data @@ -238,52 +280,6 @@ def test_api_documents_update_authenticated_editor_administrator_or_owner( assert value == new_document_values[key] -@pytest.mark.parametrize("via", VIA) -def test_api_documents_update_authenticated_owners(via, mock_user_teams): - """Administrators of a document should be allowed to update it.""" - user = factories.UserFactory(with_owned_document=True) - - client = APIClient() - client.force_login(user) - - document = factories.DocumentFactory() - if via == USER: - factories.UserDocumentAccessFactory(document=document, user=user, role="owner") - elif via == TEAM: - mock_user_teams.return_value = ["lasuite", "unknown"] - factories.TeamDocumentAccessFactory( - document=document, team="lasuite", role="owner" - ) - - old_document_values = serializers.DocumentSerializer(instance=document).data - - new_document_values = serializers.DocumentSerializer( - instance=factories.DocumentFactory() - ).data - - response = client.put( - f"/api/v1.0/documents/{document.id!s}/", new_document_values, format="json" - ) - - assert response.status_code == 200 - document = models.Document.objects.get(pk=document.pk) - document_values = serializers.DocumentSerializer(instance=document).data - for key, value in document_values.items(): - if key in [ - "id", - "created_at", - "creator", - "link_reach", - "link_role", - "nb_accesses", - ]: - assert value == old_document_values[key] - elif key == "updated_at": - assert value > old_document_values[key] - else: - assert value == new_document_values[key] - - @pytest.mark.parametrize("via", VIA) def test_api_documents_update_administrator_or_owner_of_another(via, mock_user_teams): """ From 4333b46901c443f7a2678fd91954773c010d926c Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Tue, 17 Dec 2024 17:53:05 +0100 Subject: [PATCH 07/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20depth,=20path?= =?UTF-8?q?=20and=20numchild=20to=20serialized=20document?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This information is useful for the frontend to display the document tree structure and is cheap to expose. --- src/backend/core/api/serializers.py | 12 +++++++++ .../documents/test_api_documents_list.py | 3 +++ .../documents/test_api_documents_retrieve.py | 27 +++++++++++++++++++ .../documents/test_api_documents_update.py | 6 +++++ 4 files changed, 48 insertions(+) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index d280bde6..a63841bb 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -156,10 +156,13 @@ class ListDocumentSerializer(BaseResourceSerializer): "abilities", "created_at", "creator", + "depth", "is_favorite", "link_role", "link_reach", "nb_accesses", + "numchild", + "path", "title", "updated_at", ] @@ -168,10 +171,13 @@ class ListDocumentSerializer(BaseResourceSerializer): "abilities", "created_at", "creator", + "depth", "is_favorite", "link_role", "link_reach", "nb_accesses", + "numchild", + "path", "updated_at", ] @@ -189,10 +195,13 @@ class DocumentSerializer(ListDocumentSerializer): "content", "created_at", "creator", + "depth", "is_favorite", "link_role", "link_reach", "nb_accesses", + "numchild", + "path", "title", "updated_at", ] @@ -201,10 +210,13 @@ class DocumentSerializer(ListDocumentSerializer): "abilities", "created_at", "creator", + "depth", "is_favorite", "link_role", "link_reach", "nb_accesses", + "numchild", + "path", "updated_at", ] diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 8549eaf0..8217dd44 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -63,10 +63,13 @@ def test_api_documents_list_format(): "abilities": document.get_abilities(user), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": True, "link_reach": document.link_reach, "link_role": document.link_role, "nb_accesses": 3, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 370e30fe..82200991 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -44,10 +44,13 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": False, "link_reach": "public", "link_role": document.link_role, "nb_accesses": 0, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -91,10 +94,13 @@ def test_api_documents_retrieve_anonymous_public_parent(): "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 3, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, "nb_accesses": 0, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -171,10 +177,13 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": False, "link_reach": reach, "link_role": document.link_role, "nb_accesses": 0, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -225,10 +234,13 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 3, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, "nb_accesses": 0, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -329,10 +341,13 @@ def test_api_documents_retrieve_authenticated_related_direct(): "content": document.content, "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "depth": 1, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, "nb_accesses": 2, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -383,10 +398,13 @@ def test_api_documents_retrieve_authenticated_related_parent(): "content": document.content, "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "depth": 3, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, "nb_accesses": 2, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -529,10 +547,13 @@ def test_api_documents_retrieve_authenticated_related_team_members( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, "nb_accesses": 5, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -585,10 +606,13 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, "nb_accesses": 5, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } @@ -642,10 +666,13 @@ def test_api_documents_retrieve_authenticated_related_team_owners( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "depth": 1, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, "nb_accesses": 5, + "numchild": 0, + "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), } diff --git a/src/backend/core/tests/documents/test_api_documents_update.py b/src/backend/core/tests/documents/test_api_documents_update.py index 02b8dcf2..8eaba224 100644 --- a/src/backend/core/tests/documents/test_api_documents_update.py +++ b/src/backend/core/tests/documents/test_api_documents_update.py @@ -158,8 +158,11 @@ def test_api_documents_update_anonymous_or_authenticated_unrelated( "accesses", "created_at", "creator", + "depth", "link_reach", "link_role", + "numchild", + "path", ]: assert value == old_document_values[key] elif key == "updated_at": @@ -269,9 +272,12 @@ def test_api_documents_update_authenticated_editor_administrator_or_owner( "id", "created_at", "creator", + "depth", "link_reach", "link_role", "nb_accesses", + "numchild", + "path", ]: assert value == old_document_values[key] elif key == "updated_at": From 7ff4bc457f0eabb16f30edf030a0eb404a89f721 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Tue, 17 Dec 2024 19:03:45 +0100 Subject: [PATCH 08/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20API=20endpoint?= =?UTF-8?q?=20to=20list=20a=20document's=20children?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This endpoint is nested under a document's detail endpoint. --- src/backend/core/api/viewsets.py | 20 + src/backend/core/models.py | 1 + .../test_api_documents_children_list.py | 526 ++++++++++++++++++ .../documents/test_api_documents_retrieve.py | 5 + .../core/tests/test_models_documents.py | 8 + 5 files changed, 560 insertions(+) create mode 100644 src/backend/core/tests/documents/test_api_documents_children_list.py diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index fb998be5..9dd76ed1 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -489,6 +489,26 @@ class DocumentViewSet( {"id": str(document.id)}, status=status.HTTP_201_CREATED ) + @drf.decorators.action( + detail=True, + methods=["get", "post"], + serializer_class=serializers.ListDocumentSerializer, + ) + # pylint: disable=unused-argument + def children(self, request, pk, *args, **kwargs): + """Custom action to retrieve children of a document""" + document = self.get_object() + queryset = document.get_children() + queryset = self.annotate_queryset(queryset) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return drf.response.Response(serializer.data) + @drf.decorators.action(detail=True, methods=["get"], url_path="versions") def versions_list(self, request, *args, **kwargs): """ diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 2994b804..b39914f9 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -584,6 +584,7 @@ class Document(MP_Node, BaseModel): "ai_transform": can_update, "ai_translate": can_update, "attachment_upload": can_update, + "children": can_get, "collaboration_auth": can_get, "destroy": RoleChoices.OWNER in roles, "favorite": can_get and user.is_authenticated, diff --git a/src/backend/core/tests/documents/test_api_documents_children_list.py b/src/backend/core/tests/documents/test_api_documents_children_list.py new file mode 100644 index 00000000..1f25cf7b --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_children_list.py @@ -0,0 +1,526 @@ +""" +Tests for Documents API endpoint in impress's core app: retrieve +""" + +import random + +from django.contrib.auth.models import AnonymousUser + +import pytest +from rest_framework.test import APIClient + +from core import factories + +pytestmark = pytest.mark.django_db + + +def test_api_documents_children_list_anonymous_public_standalone(): + """Anonymous users should be allowed to retrieve the children of a public documents.""" + document = factories.DocumentFactory(link_reach="public") + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = APIClient().get(f"/api/v1.0/documents/{document.id!s}/children/") + + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(AnonymousUser()), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 2, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(AnonymousUser()), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 2, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 0, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +def test_api_documents_children_list_anonymous_public_parent(): + """ + Anonymous users should be allowed to retrieve the children of a document who + has a public ancestor. + """ + grand_parent = factories.DocumentFactory(link_reach="public") + parent = factories.DocumentFactory( + parent=grand_parent, link_reach=random.choice(["authenticated", "restricted"]) + ) + document = factories.DocumentFactory( + link_reach=random.choice(["authenticated", "restricted"]), parent=parent + ) + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = APIClient().get(f"/api/v1.0/documents/{document.id!s}/children/") + + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(AnonymousUser()), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 4, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(AnonymousUser()), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 4, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 0, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +@pytest.mark.parametrize("reach", ["restricted", "authenticated"]) +def test_api_documents_children_list_anonymous_restricted_or_authenticated(reach): + """ + Anonymous users should not be able to retrieve children of a document that is not public. + """ + document = factories.DocumentFactory(link_reach=reach) + factories.DocumentFactory.create_batch(2, parent=document) + + response = APIClient().get(f"/api/v1.0/documents/{document.id!s}/children/") + + assert response.status_code == 401 + assert response.json() == { + "detail": "Authentication credentials were not provided." + } + + +@pytest.mark.parametrize("reach", ["public", "authenticated"]) +def test_api_documents_children_list_authenticated_unrelated_public_or_authenticated( + reach, +): + """ + Authenticated users should be able to retrieve the children of a public/authenticated + document to which they are not related. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach=reach) + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/children/", + ) + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(user), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 2, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(user), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 2, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 0, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +@pytest.mark.parametrize("reach", ["public", "authenticated"]) +def test_api_documents_children_list_authenticated_public_or_authenticated_parent( + reach, +): + """ + Authenticated users should be allowed to retrieve the children of a document who + has a public or authenticated ancestor. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory(link_reach=reach) + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(link_reach="restricted", parent=parent) + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = client.get(f"/api/v1.0/documents/{document.id!s}/children/") + + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(user), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 4, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(user), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 4, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 0, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +def test_api_documents_children_list_authenticated_unrelated_restricted(): + """ + Authenticated users should not be allowed to retrieve the children of a document that is + restricted and to which they are not related. + """ + user = factories.UserFactory(with_owned_document=True) + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + child1, _child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/children/", + ) + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + +def test_api_documents_children_list_authenticated_related_direct(): + """ + Authenticated users should be allowed to retrieve the children of a document + to which they are directly related whatever the role. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory() + factories.UserDocumentAccessFactory(document=document, user=user) + factories.UserDocumentAccessFactory(document=document) + + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/children/", + ) + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(user), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 2, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 3, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(user), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 2, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 2, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +def test_api_documents_children_list_authenticated_related_parent(): + """ + Authenticated users should be allowed to retrieve the children of a document if they + are related to one of its ancestors whatever the role. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory(link_reach="restricted") + parent = factories.DocumentFactory(parent=grand_parent, link_reach="restricted") + document = factories.DocumentFactory(parent=parent, link_reach="restricted") + + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + factories.UserDocumentAccessFactory(document=child1) + + factories.UserDocumentAccessFactory(document=grand_parent, user=user) + factories.UserDocumentAccessFactory(document=grand_parent) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/children/", + ) + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(user), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 4, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 3, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(user), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 4, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 2, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } + + +def test_api_documents_children_list_authenticated_related_child(): + """ + Authenticated users should not be allowed to retrieve all the children of a document + as a result of being related to one of its children. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + child1, _child2 = factories.DocumentFactory.create_batch(2, parent=document) + + factories.UserDocumentAccessFactory(document=child1, user=user) + factories.UserDocumentAccessFactory(document=document) + + response = client.get( + f"/api/v1.0/documents/{document.id!s}/children/", + ) + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + +def test_api_documents_children_list_authenticated_related_team_none(mock_user_teams): + """ + Authenticated users should not be able to retrieve the children of a restricted document + related to teams in which the user is not. + """ + mock_user_teams.return_value = [] + + user = factories.UserFactory(with_owned_document=True) + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + factories.DocumentFactory.create_batch(2, parent=document) + + factories.TeamDocumentAccessFactory(document=document, team="myteam") + + response = client.get(f"/api/v1.0/documents/{document.id!s}/children/") + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + +def test_api_documents_children_list_authenticated_related_team_members( + mock_user_teams, +): + """ + Authenticated users should be allowed to retrieve the children of a document to which they + are related via a team whatever the role. + """ + mock_user_teams.return_value = ["myteam"] + + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(link_reach="restricted") + child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) + + factories.TeamDocumentAccessFactory(document=document, team="myteam") + + response = client.get(f"/api/v1.0/documents/{document.id!s}/children/") + + # pylint: disable=R0801 + assert response.status_code == 200 + assert response.json() == { + "count": 2, + "next": None, + "previous": None, + "results": [ + { + "abilities": child1.get_abilities(user), + "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child1.creator.id), + "depth": 2, + "excerpt": child1.excerpt, + "id": str(child1.id), + "is_favorite": False, + "link_reach": child1.link_reach, + "link_role": child1.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child1.path, + "title": child1.title, + "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + }, + { + "abilities": child2.get_abilities(user), + "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(child2.creator.id), + "depth": 2, + "excerpt": child2.excerpt, + "id": str(child2.id), + "is_favorite": False, + "link_reach": child2.link_reach, + "link_role": child2.link_role, + "numchild": 0, + "nb_accesses": 1, + "path": child2.path, + "title": child2.title, + "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + }, + ], + } diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 82200991..6d96432d 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -27,6 +27,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "ai_transform": document.link_role == "editor", "ai_translate": document.link_role == "editor", "attachment_upload": document.link_role == "editor", + "children": True, "collaboration_auth": True, "destroy": False, # Anonymous user can't favorite a document even with read access @@ -77,6 +78,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "ai_transform": grand_parent.link_role == "editor", "ai_translate": grand_parent.link_role == "editor", "attachment_upload": grand_parent.link_role == "editor", + "children": True, "collaboration_auth": True, "destroy": False, # Anonymous user can't favorite a document even with read access @@ -161,6 +163,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "ai_transform": document.link_role == "editor", "ai_translate": document.link_role == "editor", "attachment_upload": document.link_role == "editor", + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -218,6 +221,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "ai_transform": grand_parent.link_role == "editor", "ai_translate": grand_parent.link_role == "editor", "attachment_upload": grand_parent.link_role == "editor", + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -382,6 +386,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "ai_transform": access.role != "reader", "ai_translate": access.role != "reader", "attachment_upload": access.role != "reader", + "children": True, "collaboration_auth": True, "destroy": access.role == "owner", "favorite": True, diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index 598e5d3f..ae1443a0 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -109,6 +109,7 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role) "ai_transform": False, "ai_translate": False, "attachment_upload": False, + "children": False, "collaboration_auth": False, "destroy": False, "favorite": False, @@ -146,6 +147,7 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach): "ai_transform": False, "ai_translate": False, "attachment_upload": False, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": is_authenticated, @@ -183,6 +185,7 @@ def test_models_documents_get_abilities_editor(is_authenticated, reach): "ai_transform": True, "ai_translate": True, "attachment_upload": True, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": is_authenticated, @@ -209,6 +212,7 @@ def test_models_documents_get_abilities_owner(): "ai_transform": True, "ai_translate": True, "attachment_upload": True, + "children": True, "collaboration_auth": True, "destroy": True, "favorite": True, @@ -234,6 +238,7 @@ def test_models_documents_get_abilities_administrator(): "ai_transform": True, "ai_translate": True, "attachment_upload": True, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -262,6 +267,7 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries): "ai_transform": True, "ai_translate": True, "attachment_upload": True, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -292,6 +298,7 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries): "ai_transform": False, "ai_translate": False, "attachment_upload": False, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -323,6 +330,7 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries): "ai_transform": False, "ai_translate": False, "attachment_upload": False, + "children": True, "collaboration_auth": True, "destroy": False, "favorite": True, From 1d0386d9b5d89783b469c7e9b0bb75a44e5c5138 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Wed, 18 Dec 2024 08:44:12 +0100 Subject: [PATCH 09/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20API=20endpoint?= =?UTF-8?q?=20to=20create=20children=20for=20a=20document?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We add a POST method to the existing children endpoint. --- src/backend/core/api/permissions.py | 3 +- src/backend/core/api/viewsets.py | 34 ++- src/backend/core/models.py | 3 +- .../test_api_documents_children_create.py | 249 ++++++++++++++++++ .../documents/test_api_documents_retrieve.py | 15 +- .../core/tests/test_models_documents.py | 24 +- 6 files changed, 310 insertions(+), 18 deletions(-) create mode 100644 src/backend/core/tests/documents/test_api_documents_children_create.py diff --git a/src/backend/core/api/permissions.py b/src/backend/core/api/permissions.py index 445a2c16..f2080192 100644 --- a/src/backend/core/api/permissions.py +++ b/src/backend/core/api/permissions.py @@ -8,7 +8,8 @@ from rest_framework import permissions from core.models import DocumentAccess, RoleChoices ACTION_FOR_METHOD_TO_PERMISSION = { - "versions_detail": {"DELETE": "versions_destroy", "GET": "versions_retrieve"} + "versions_detail": {"DELETE": "versions_destroy", "GET": "versions_retrieve"}, + "children": {"GET": "children_list", "POST": "children_create"}, } diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 9dd76ed1..9087c95d 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -12,6 +12,7 @@ from django.contrib.postgres.search import TrigramSimilarity from django.core.exceptions import ValidationError from django.core.files.storage import default_storage from django.db import models as db +from django.db import transaction from django.db.models import ( Exists, F, @@ -493,11 +494,38 @@ class DocumentViewSet( detail=True, methods=["get", "post"], serializer_class=serializers.ListDocumentSerializer, + url_path="children", ) - # pylint: disable=unused-argument - def children(self, request, pk, *args, **kwargs): - """Custom action to retrieve children of a document""" + def children(self, request, *args, **kwargs): + """Handle listing and creating children of a document""" document = self.get_object() + + if request.method == "POST": + # Create a child document + serializer = serializers.DocumentSerializer( + data=request.data, context=self.get_serializer_context() + ) + serializer.is_valid(raise_exception=True) + + with transaction.atomic(): + child_document = document.add_child( + creator=request.user, + **serializer.validated_data, + ) + models.DocumentAccess.objects.create( + document=child_document, + user=request.user, + role=models.RoleChoices.OWNER, + ) + # Set the created instance to the serializer + serializer.instance = child_document + + headers = self.get_success_headers(serializer.data) + return drf.response.Response( + serializer.data, status=status.HTTP_201_CREATED, headers=headers + ) + + # GET: List children queryset = document.get_children() queryset = self.annotate_queryset(queryset) diff --git a/src/backend/core/models.py b/src/backend/core/models.py index b39914f9..e4449596 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -584,7 +584,8 @@ class Document(MP_Node, BaseModel): "ai_transform": can_update, "ai_translate": can_update, "attachment_upload": can_update, - "children": can_get, + "children_list": can_get, + "children_create": can_update and user.is_authenticated, "collaboration_auth": can_get, "destroy": RoleChoices.OWNER in roles, "favorite": can_get and user.is_authenticated, diff --git a/src/backend/core/tests/documents/test_api_documents_children_create.py b/src/backend/core/tests/documents/test_api_documents_children_create.py new file mode 100644 index 00000000..ffac8f2b --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_children_create.py @@ -0,0 +1,249 @@ +""" +Tests for Documents API endpoint in impress's core app: create +""" + +import random +from uuid import uuid4 + +import pytest +from rest_framework.test import APIClient + +from core import factories +from core.models import Document, LinkReachChoices, LinkRoleChoices + +pytestmark = pytest.mark.django_db + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("role", LinkRoleChoices.values) +@pytest.mark.parametrize("reach", LinkReachChoices.values) +def test_api_documents_children_create_anonymous(reach, role, depth): + """Anonymous users should not be allowed to create children documents.""" + for i in range(depth): + if i == 0: + document = factories.DocumentFactory(link_reach=reach, link_role=role) + else: + document = factories.DocumentFactory(parent=document) + + response = APIClient().post( + f"/api/v1.0/documents/{document.id!s}/children/", + { + "title": "my document", + }, + ) + + assert response.status_code == 401 + assert Document.objects.count() == depth + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize( + "reach,role", + [ + ["restricted", "editor"], + ["restricted", "reader"], + ["public", "reader"], + ["authenticated", "reader"], + ], +) +def test_api_documents_children_create_authenticated_forbidden(reach, role, depth): + """ + Authenticated users with no write access on a document should not be allowed + to create a nested document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + for i in range(depth): + if i == 0: + document = factories.DocumentFactory(link_reach=reach, link_role=role) + else: + document = factories.DocumentFactory(parent=document, link_role="reader") + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/children/", + { + "title": "my document", + }, + ) + + assert response.status_code == 403 + assert Document.objects.count() == depth + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize( + "reach,role", + [ + ["public", "editor"], + ["authenticated", "editor"], + ], +) +def test_api_documents_children_create_authenticated_success(reach, role, depth): + """ + Authenticated users with write access on a document should be able + to create a nested document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + for i in range(depth): + if i == 0: + document = factories.DocumentFactory(link_reach=reach, link_role=role) + else: + document = factories.DocumentFactory(parent=document, link_role="reader") + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/children/", + { + "title": "my child", + }, + ) + + assert response.status_code == 201 + + child = Document.objects.get(id=response.json()["id"]) + assert child.title == "my child" + assert child.link_reach == "restricted" + assert child.accesses.filter(role="owner", user=user).exists() + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +def test_api_documents_children_create_related_forbidden(depth): + """ + Authenticated users with a specific read access on a document should not be allowed + to create a nested document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + for i in range(depth): + if i == 0: + document = factories.DocumentFactory(link_reach="restricted") + factories.UserDocumentAccessFactory( + user=user, document=document, role="reader" + ) + else: + document = factories.DocumentFactory( + parent=document, link_reach="restricted" + ) + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/children/", + { + "title": "my document", + }, + ) + + assert response.status_code == 403 + assert Document.objects.count() == depth + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("role", ["editor", "administrator", "owner"]) +def test_api_documents_children_create_related_success(role, depth): + """ + Authenticated users with a specific write access on a document should be + able to create a nested document. + """ + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + for i in range(depth): + if i == 0: + document = factories.DocumentFactory(link_reach="restricted") + factories.UserDocumentAccessFactory(user=user, document=document, role=role) + else: + document = factories.DocumentFactory( + parent=document, link_reach="restricted" + ) + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/children/", + { + "title": "my child", + }, + ) + + assert response.status_code == 201 + child = Document.objects.get(id=response.json()["id"]) + assert child.title == "my child" + assert child.link_reach == "restricted" + assert child.accesses.filter(role="owner", user=user).exists() + + +def test_api_documents_children_create_authenticated_title_null(): + """It should be possible to create several nested documents with a null title.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + parent = factories.DocumentFactory( + title=None, link_reach="authenticated", link_role="editor" + ) + factories.DocumentFactory(title=None, parent=parent) + + response = client.post( + f"/api/v1.0/documents/{parent.id!s}/children/", {}, format="json" + ) + + assert response.status_code == 201 + assert Document.objects.filter(title__isnull=True).count() == 3 + + +def test_api_documents_children_create_force_id_success(): + """It should be possible to force the document ID when creating a nested document.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + access = factories.UserDocumentAccessFactory(user=user, role="editor") + forced_id = uuid4() + + response = client.post( + f"/api/v1.0/documents/{access.document.id!s}/children/", + { + "id": str(forced_id), + "title": "my document", + }, + format="json", + ) + + assert response.status_code == 201 + assert Document.objects.count() == 2 + assert response.json()["id"] == str(forced_id) + + +def test_api_documents_children_create_force_id_existing(): + """ + It should not be possible to use the ID of an existing document when forcing ID on creation. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + access = factories.UserDocumentAccessFactory(user=user, role="editor") + document = factories.DocumentFactory() + + response = client.post( + f"/api/v1.0/documents/{access.document.id!s}/children/", + { + "id": str(document.id), + "title": "my document", + }, + format="json", + ) + + assert response.status_code == 400 + assert response.json() == { + "id": ["A document with this ID already exists. You cannot override it."] + } diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 6d96432d..f1315e93 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -27,7 +27,8 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "ai_transform": document.link_role == "editor", "ai_translate": document.link_role == "editor", "attachment_upload": document.link_role == "editor", - "children": True, + "children_create": False, + "children_list": True, "collaboration_auth": True, "destroy": False, # Anonymous user can't favorite a document even with read access @@ -78,7 +79,8 @@ def test_api_documents_retrieve_anonymous_public_parent(): "ai_transform": grand_parent.link_role == "editor", "ai_translate": grand_parent.link_role == "editor", "attachment_upload": grand_parent.link_role == "editor", - "children": True, + "children_create": False, + "children_list": True, "collaboration_auth": True, "destroy": False, # Anonymous user can't favorite a document even with read access @@ -163,7 +165,8 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "ai_transform": document.link_role == "editor", "ai_translate": document.link_role == "editor", "attachment_upload": document.link_role == "editor", - "children": True, + "children_create": document.link_role == "editor", + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -221,7 +224,8 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "ai_transform": grand_parent.link_role == "editor", "ai_translate": grand_parent.link_role == "editor", "attachment_upload": grand_parent.link_role == "editor", - "children": True, + "children_create": grand_parent.link_role == "editor", + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -386,7 +390,8 @@ def test_api_documents_retrieve_authenticated_related_parent(): "ai_transform": access.role != "reader", "ai_translate": access.role != "reader", "attachment_upload": access.role != "reader", - "children": True, + "children_create": access.role != "reader", + "children_list": True, "collaboration_auth": True, "destroy": access.role == "owner", "favorite": True, diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index ae1443a0..b961499a 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -109,7 +109,8 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role) "ai_transform": False, "ai_translate": False, "attachment_upload": False, - "children": False, + "children_create": False, + "children_list": False, "collaboration_auth": False, "destroy": False, "favorite": False, @@ -147,7 +148,8 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach): "ai_transform": False, "ai_translate": False, "attachment_upload": False, - "children": True, + "children_create": False, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": is_authenticated, @@ -185,7 +187,8 @@ def test_models_documents_get_abilities_editor(is_authenticated, reach): "ai_transform": True, "ai_translate": True, "attachment_upload": True, - "children": True, + "children_create": is_authenticated, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": is_authenticated, @@ -212,7 +215,8 @@ def test_models_documents_get_abilities_owner(): "ai_transform": True, "ai_translate": True, "attachment_upload": True, - "children": True, + "children_create": True, + "children_list": True, "collaboration_auth": True, "destroy": True, "favorite": True, @@ -238,7 +242,8 @@ def test_models_documents_get_abilities_administrator(): "ai_transform": True, "ai_translate": True, "attachment_upload": True, - "children": True, + "children_create": True, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -267,7 +272,8 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries): "ai_transform": True, "ai_translate": True, "attachment_upload": True, - "children": True, + "children_create": True, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -298,7 +304,8 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries): "ai_transform": False, "ai_translate": False, "attachment_upload": False, - "children": True, + "children_create": False, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, @@ -330,7 +337,8 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries): "ai_transform": False, "ai_translate": False, "attachment_upload": False, - "children": True, + "children_create": False, + "children_list": True, "collaboration_auth": True, "destroy": False, "favorite": True, From 8117866ce75bfe1057914f810a5eefeecc22ad8b Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Wed, 18 Dec 2024 11:37:01 +0100 Subject: [PATCH 10/22] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20remove=20co?= =?UTF-8?q?ntent=20from=20list=20serializer=20and=20introduce=20excerpt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Including the content field in the list view is not efficient as we need to query the object storage to retrieve it. We want to display an excerpt of the content on the list view so we should store it in database. We let the frontend compute it and save it for us in the new "excerpt" field because we are not supposed to have access to the content (E2EE feature coming) --- CHANGELOG.md | 5 ++++ src/backend/core/api/serializers.py | 4 +++- src/backend/core/factories.py | 1 + .../migrations/0015_add_document_excerpt.py | 23 +++++++++++++++++++ src/backend/core/models.py | 1 + .../test_api_documents_children_create.py | 1 - .../documents/test_api_documents_list.py | 2 +- .../documents/test_api_documents_retrieve.py | 9 ++++++++ 8 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/backend/core/migrations/0015_add_document_excerpt.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cd8268b..22168164 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to ## Added - ✨(backend) allow organizing documents in a tree structure #516 +- ✨(backend) add "excerpt" field to document list serializer #516 - ✨(backend) add github actions to manage Crowdin workflow #559 & #563 - 📈Integrate Posthog #540 - 🏷️(backend) add content-type to uploaded files #552 @@ -22,6 +23,10 @@ and this project adheres to - 💄(frontend) add abilities on doc row #581 - 💄(frontend) improve DocsGridItem responsive padding #582 +## Removed + +- 🔥(backend) remove "content" field from list serializer # 516 + ## [2.0.1] - 2025-01-17 ## Fixed diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index a63841bb..28cd4efa 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -152,11 +152,11 @@ class ListDocumentSerializer(BaseResourceSerializer): model = models.Document fields = [ "id", - "content", "abilities", "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", @@ -172,6 +172,7 @@ class ListDocumentSerializer(BaseResourceSerializer): "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", @@ -196,6 +197,7 @@ class DocumentSerializer(ListDocumentSerializer): "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index 5a77ad09..2a6ad53a 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -74,6 +74,7 @@ class DocumentFactory(factory.django.DjangoModelFactory): parent = ParentNodeFactory() title = factory.Sequence(lambda n: f"document{n}") + excerpt = factory.Sequence(lambda n: f"excerpt{n}") content = factory.Sequence(lambda n: f"content{n}") creator = factory.SubFactory(UserFactory) link_reach = factory.fuzzy.FuzzyChoice( diff --git a/src/backend/core/migrations/0015_add_document_excerpt.py b/src/backend/core/migrations/0015_add_document_excerpt.py new file mode 100644 index 00000000..916e4be2 --- /dev/null +++ b/src/backend/core/migrations/0015_add_document_excerpt.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.4 on 2024-12-18 08:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_set_path_on_existing_documents'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='excerpt', + field=models.TextField(blank=True, max_length=300, null=True, verbose_name='excerpt'), + ), + migrations.AlterField( + model_name='user', + name='language', + field=models.CharField(choices="(('en-us', 'English'), ('fr-fr', 'French'), ('de-de', 'German'))", default='en-us', help_text='The language in which the user wants to see the interface.', max_length=10, verbose_name='language'), + ), + ] diff --git a/src/backend/core/models.py b/src/backend/core/models.py index e4449596..ec75922b 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -358,6 +358,7 @@ class Document(MP_Node, BaseModel): """Pad document carrying the content.""" title = models.CharField(_("title"), max_length=255, null=True, blank=True) + excerpt = models.TextField(_("excerpt"), max_length=300, null=True, blank=True) link_reach = models.CharField( max_length=20, choices=LinkReachChoices.choices, diff --git a/src/backend/core/tests/documents/test_api_documents_children_create.py b/src/backend/core/tests/documents/test_api_documents_children_create.py index ffac8f2b..775b132a 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_create.py +++ b/src/backend/core/tests/documents/test_api_documents_children_create.py @@ -2,7 +2,6 @@ Tests for Documents API endpoint in impress's core app: create """ -import random from uuid import uuid4 import pytest diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 8217dd44..ca2de1b1 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -59,11 +59,11 @@ def test_api_documents_list_format(): assert len(results) == 1 assert results[0] == { "id": str(document.id), - "content": document.content, "abilities": document.get_abilities(user), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": True, "link_reach": document.link_reach, "link_role": document.link_role, diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index f1315e93..239c9acb 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -47,6 +47,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "public", "link_role": document.link_role, @@ -99,6 +100,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -184,6 +186,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": reach, "link_role": document.link_role, @@ -243,6 +246,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -350,6 +354,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -409,6 +414,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -558,6 +564,7 @@ def test_api_documents_retrieve_authenticated_related_team_members( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -617,6 +624,7 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -677,6 +685,7 @@ def test_api_documents_retrieve_authenticated_related_team_owners( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, From 0003f9d0de588b21a6751b5e8a26d9b62b4dbb33 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Thu, 2 Jan 2025 14:02:03 +0100 Subject: [PATCH 11/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20user=20roles?= =?UTF-8?q?=20as=20field=20in=20the=20document=20API=20representation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit user roles were already computed as an annotation on the query for performance as we must look at all the document's ancestors to determine the roles that apply recursively. We can easily expose them as readonly via the serializer. --- src/backend/core/api/serializers.py | 15 +++ .../test_api_documents_children_list.py | 20 +++- .../documents/test_api_documents_list.py | 6 +- .../documents/test_api_documents_retrieve.py | 97 +++++++++++++++---- 4 files changed, 114 insertions(+), 24 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 28cd4efa..556f209e 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -147,6 +147,7 @@ class ListDocumentSerializer(BaseResourceSerializer): is_favorite = serializers.BooleanField(read_only=True) nb_accesses = serializers.IntegerField(read_only=True) + user_roles = serializers.SerializerMethodField(read_only=True) class Meta: model = models.Document @@ -165,6 +166,7 @@ class ListDocumentSerializer(BaseResourceSerializer): "path", "title", "updated_at", + "user_roles", ] read_only_fields = [ "id", @@ -180,8 +182,19 @@ class ListDocumentSerializer(BaseResourceSerializer): "numchild", "path", "updated_at", + "user_roles", ] + def get_user_roles(self, document): + """ + Return roles of the logged-in user for the current document, + taking into account ancestors. + """ + request = self.context.get("request") + if request: + return document.get_roles(request.user) + return [] + class DocumentSerializer(ListDocumentSerializer): """Serialize documents with all fields for display in detail views.""" @@ -206,6 +219,7 @@ class DocumentSerializer(ListDocumentSerializer): "path", "title", "updated_at", + "user_roles", ] read_only_fields = [ "id", @@ -220,6 +234,7 @@ class DocumentSerializer(ListDocumentSerializer): "numchild", "path", "updated_at", + "user_roles", ] def get_fields(self): diff --git a/src/backend/core/tests/documents/test_api_documents_children_list.py b/src/backend/core/tests/documents/test_api_documents_children_list.py index 1f25cf7b..81c3f3c1 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_list.py +++ b/src/backend/core/tests/documents/test_api_documents_children_list.py @@ -43,6 +43,7 @@ def test_api_documents_children_list_anonymous_public_standalone(): "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, { "abilities": child2.get_abilities(AnonymousUser()), @@ -59,6 +60,7 @@ def test_api_documents_children_list_anonymous_public_standalone(): "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, ], } @@ -102,6 +104,7 @@ def test_api_documents_children_list_anonymous_public_parent(): "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, { "abilities": child2.get_abilities(AnonymousUser()), @@ -118,6 +121,7 @@ def test_api_documents_children_list_anonymous_public_parent(): "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, ], } @@ -179,6 +183,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, { "abilities": child2.get_abilities(user), @@ -195,6 +200,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, ], } @@ -242,6 +248,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, { "abilities": child2.get_abilities(user), @@ -258,6 +265,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], }, ], } @@ -327,6 +335,7 @@ def test_api_documents_children_list_authenticated_related_direct(): "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], }, { "abilities": child2.get_abilities(user), @@ -343,6 +352,7 @@ def test_api_documents_children_list_authenticated_related_direct(): "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], }, ], } @@ -365,8 +375,10 @@ def test_api_documents_children_list_authenticated_related_parent(): child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) factories.UserDocumentAccessFactory(document=child1) + grand_parent_access = factories.UserDocumentAccessFactory( + document=grand_parent, user=user + ) factories.UserDocumentAccessFactory(document=grand_parent, user=user) - factories.UserDocumentAccessFactory(document=grand_parent) response = client.get( f"/api/v1.0/documents/{document.id!s}/children/", @@ -392,6 +404,7 @@ def test_api_documents_children_list_authenticated_related_parent(): "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [grand_parent_access.role], }, { "abilities": child2.get_abilities(user), @@ -408,6 +421,7 @@ def test_api_documents_children_list_authenticated_related_parent(): "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [grand_parent_access.role], }, ], } @@ -479,7 +493,7 @@ def test_api_documents_children_list_authenticated_related_team_members( document = factories.DocumentFactory(link_reach="restricted") child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) - factories.TeamDocumentAccessFactory(document=document, team="myteam") + access = factories.TeamDocumentAccessFactory(document=document, team="myteam") response = client.get(f"/api/v1.0/documents/{document.id!s}/children/") @@ -505,6 +519,7 @@ def test_api_documents_children_list_authenticated_related_team_members( "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], }, { "abilities": child2.get_abilities(user), @@ -521,6 +536,7 @@ def test_api_documents_children_list_authenticated_related_team_members( "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], }, ], } diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index ca2de1b1..b9ab03c2 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -35,16 +35,16 @@ def test_api_documents_list_anonymous(reach, role): def test_api_documents_list_format(): """Validate the format of documents as returned by the list view.""" user = factories.UserFactory() - client = APIClient() client.force_login(user) other_users = factories.UserFactory.create_batch(3) document = factories.DocumentFactory( - users=[user, *factories.UserFactory.create_batch(2)], + users=factories.UserFactory.create_batch(2), favorited_by=[user, *other_users], link_traces=other_users, ) + access = factories.UserDocumentAccessFactory(document=document, user=user) response = client.get("/api/v1.0/documents/") @@ -72,6 +72,7 @@ def test_api_documents_list_format(): "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], } @@ -230,7 +231,6 @@ def test_api_documents_list_authenticated_link_reach_public_or_authenticated( assert response.status_code == 200 results = response.json()["results"] - assert len(results) == 3 results_id = {result["id"] for result in results} assert expected_ids == results_id diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 239c9acb..7c530e4f 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -56,6 +56,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], } @@ -109,6 +110,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], } @@ -195,6 +197,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], } assert ( models.LinkTrace.objects.filter(document=document, user=user).exists() is True @@ -255,6 +258,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [], } @@ -340,7 +344,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): client.force_login(user) document = factories.DocumentFactory() - factories.UserDocumentAccessFactory(document=document, user=user) + access = factories.UserDocumentAccessFactory(document=document, user=user) factories.UserDocumentAccessFactory(document=document) response = client.get( @@ -363,6 +367,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], } @@ -423,6 +428,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": [access.role], } @@ -516,16 +522,16 @@ def test_api_documents_retrieve_authenticated_related_team_none(mock_user_teams) @pytest.mark.parametrize( - "teams", + "teams,roles", [ - ["readers"], - ["unknown", "readers"], - ["editors"], - ["unknown", "editors"], + [["readers"], ["reader"]], + [["unknown", "readers"], ["reader"]], + [["editors"], ["editor"]], + [["unknown", "editors"], ["editor"]], ], ) def test_api_documents_retrieve_authenticated_related_team_members( - teams, mock_user_teams + teams, roles, mock_user_teams ): """ Authenticated users should be allowed to retrieve a document to which they @@ -573,19 +579,20 @@ def test_api_documents_retrieve_authenticated_related_team_members( "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": roles, } @pytest.mark.parametrize( - "teams", + "teams,roles", [ - ["administrators"], - ["editors", "administrators"], - ["unknown", "administrators"], + [["administrators"], ["administrator"]], + [["editors", "administrators"], ["administrator", "editor"]], + [["unknown", "administrators"], ["administrator"]], ], ) def test_api_documents_retrieve_authenticated_related_team_administrators( - teams, mock_user_teams + teams, roles, mock_user_teams ): """ Authenticated users should be allowed to retrieve a document to which they @@ -633,20 +640,21 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": roles, } @pytest.mark.parametrize( - "teams", + "teams,roles", [ - ["owners"], - ["owners", "administrators"], - ["members", "administrators", "owners"], - ["unknown", "owners"], + [["owners"], ["owner"]], + [["owners", "administrators"], ["owner", "administrator"]], + [["members", "administrators", "owners"], ["owner", "administrator"]], + [["unknown", "owners"], ["owner"]], ], ) def test_api_documents_retrieve_authenticated_related_team_owners( - teams, mock_user_teams + teams, roles, mock_user_teams ): """ Authenticated users should be allowed to retrieve a restricted document to which @@ -655,7 +663,6 @@ def test_api_documents_retrieve_authenticated_related_team_owners( mock_user_teams.return_value = teams user = factories.UserFactory() - client = APIClient() client.force_login(user) @@ -694,4 +701,56 @@ def test_api_documents_retrieve_authenticated_related_team_owners( "path": document.path, "title": document.title, "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": roles, } + + +def test_api_documents_retrieve_user_roles(django_assert_num_queries): + """ + Roles should be annotated on querysets taking into account all documents ancestors. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory( + users=factories.UserFactory.create_batch(2) + ) + parent = factories.DocumentFactory( + parent=grand_parent, users=factories.UserFactory.create_batch(2) + ) + document = factories.DocumentFactory( + parent=parent, users=factories.UserFactory.create_batch(2) + ) + + accesses = ( + factories.UserDocumentAccessFactory(document=grand_parent, user=user), + factories.UserDocumentAccessFactory(document=parent, user=user), + factories.UserDocumentAccessFactory(document=document, user=user), + ) + expected_roles = {access.role for access in accesses} + + with django_assert_num_queries(8): + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + + user_roles = response.json()["user_roles"] + assert set(user_roles) == expected_roles + + +def test_api_documents_retrieve_numqueries_with_link_trace(django_assert_num_queries): + """If the link traced already exists, the number of queries should be minimal.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(users=[user], link_traces=[user]) + + with django_assert_num_queries(2): + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + + assert response.json()["id"] == str(document.id) + From 7b39b3f7f6afd3b29e139a6b69cf630659aabca2 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Sat, 4 Jan 2025 23:50:36 +0100 Subject: [PATCH 12/22] =?UTF-8?q?=E2=9C=85(backend)=20improve=20test=20err?= =?UTF-8?q?or?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test was missing the status code check. Without this check the error that follows does not make sense because the content returned is not at all what we expect in the following assert statement. --- src/backend/core/tests/documents/test_api_document_versions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/core/tests/documents/test_api_document_versions.py b/src/backend/core/tests/documents/test_api_document_versions.py index 83344259..cb727a1d 100644 --- a/src/backend/core/tests/documents/test_api_document_versions.py +++ b/src/backend/core/tests/documents/test_api_document_versions.py @@ -229,6 +229,8 @@ def test_api_document_versions_list_authenticated_related_pagination_parent( ) content = response.json() + + assert response.status_code == 200 assert content["is_truncated"] is False # The current version is not listed assert content["count"] == 3 From 2e8a3996687a6bf095e3f0a5879c8fee4965840f Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Sat, 4 Jan 2025 23:52:11 +0100 Subject: [PATCH 13/22] =?UTF-8?q?=E2=9C=85(backend)=20override=20defaults.?= =?UTF-8?q?NB=5FOBJECTS=20for=20the=20demo=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Otherwise when you increase the number of objects to test how the application scales, the demo test will take too long... --- src/backend/demo/tests/test_commands_create_demo.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/backend/demo/tests/test_commands_create_demo.py b/src/backend/demo/tests/test_commands_create_demo.py index 66f227bc..3cd52e17 100644 --- a/src/backend/demo/tests/test_commands_create_demo.py +++ b/src/backend/demo/tests/test_commands_create_demo.py @@ -1,4 +1,5 @@ """Test the `create_demo` management command""" +from unittest import mock from django.core.management import call_command from django.test import override_settings @@ -10,15 +11,20 @@ from core import models pytestmark = pytest.mark.django_db +@mock.patch("demo.defaults.NB_OBJECTS", { + "users": 10, + "docs": 10, + "max_users_per_document": 5, + } ) @override_settings(DEBUG=True) def test_commands_create_demo(): """The create_demo management command should create objects as expected.""" call_command("create_demo") assert models.Template.objects.count() == 1 - assert models.User.objects.count() >= 50 - assert models.Document.objects.count() >= 50 - assert models.DocumentAccess.objects.count() > 50 + assert models.User.objects.count() >= 10 + assert models.Document.objects.count() >= 10 + assert models.DocumentAccess.objects.count() > 10 # assert dev users have doc accesses user = models.User.objects.get(email="impress@impress.world") From 4de03d292a9d5318a31247515802229c2364ede9 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Thu, 2 Jan 2025 23:15:03 +0100 Subject: [PATCH 14/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20API=20endpoint?= =?UTF-8?q?=20to=20move=20a=20document=20in=20the=20document=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only administrators or owners of a document can move it to a target document for which they are also administrator or owner. We allow different moving modes: - first-child: move the document as the first child of the target - last-child: move the document as the last child of the target - first-sibling: move the document as the first sibling of the target - last-sibling: move the document as the last sibling of the target - left: move the document as sibling ordered just before the target - right: move the document as sibling ordered just after the target The whole subtree below the document that is being moved, moves as well and remains below the document after it is moved. --- src/backend/core/api/serializers.py | 34 ++ src/backend/core/api/viewsets.py | 60 ++++ src/backend/core/enums.py | 12 + src/backend/core/models.py | 1 + .../documents/test_api_documents_move.py | 339 ++++++++++++++++++ .../documents/test_api_documents_retrieve.py | 8 +- .../core/tests/test_models_documents.py | 8 + .../demo/tests/test_commands_create_demo.py | 8 +- 8 files changed, 466 insertions(+), 4 deletions(-) create mode 100644 src/backend/core/tests/documents/test_api_documents_move.py diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 556f209e..c16ecd4d 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -568,3 +568,37 @@ class AITranslateSerializer(serializers.Serializer): if len(value.strip()) == 0: raise serializers.ValidationError("Text field cannot be empty.") return value + + +class MoveDocumentSerializer(serializers.Serializer): + """ + Serializer for validating input data to move a document within the tree structure. + + Fields: + - target_document_id (UUIDField): The ID of the target parent document where the + document should be moved. This field is required and must be a valid UUID. + - position (ChoiceField): Specifies the position of the document in relation to + the target parent's children. + Choices: + - "first-child": Place the document as the first child of the target parent. + - "last-child": Place the document as the last child of the target parent (default). + - "left": Place the document as the left sibling of the target parent. + - "right": Place the document as the right sibling of the target parent. + + Example: + Input payload for moving a document: + { + "target_document_id": "123e4567-e89b-12d3-a456-426614174000", + "position": "first-child" + } + + Notes: + - The `target_document_id` is mandatory. + - The `position` defaults to "last-child" if not provided. + """ + + target_document_id = serializers.UUIDField(required=True) + position = serializers.ChoiceField( + choices=enums.MoveNodePositionChoices.choices, + default=enums.MoveNodePositionChoices.LAST_CHILD, + ) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 9087c95d..e34b4695 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -311,6 +311,7 @@ class DocumentMetadata(drf.metadata.SimpleMetadata): return simple_metadata +# pylint: disable=too-many-public-methods class DocumentViewSet( drf.mixins.CreateModelMixin, drf.mixins.DestroyModelMixin, @@ -490,6 +491,65 @@ class DocumentViewSet( {"id": str(document.id)}, status=status.HTTP_201_CREATED ) + @drf.decorators.action(detail=True, methods=["post"]) + @transaction.atomic + def move(self, request, *args, **kwargs): + """ + Move a document to another location within the document tree. + + The user must be an administrator or owner of both the document being moved + and the target parent document. + """ + user = request.user + document = self.get_object() # including permission checks + + # Validate the input payload + serializer = serializers.MoveDocumentSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + validated_data = serializer.validated_data + + target_document_id = validated_data["target_document_id"] + try: + target_document = models.Document.objects.get( + id=target_document_id, ancestors_deleted_at__isnull=True + ) + except models.Document.DoesNotExist: + return drf.response.Response( + {"target_document_id": "Target parent document does not exist."}, + status=status.HTTP_400_BAD_REQUEST, + ) + + position = validated_data["position"] + message = None + + if position in [ + enums.MoveNodePositionChoices.FIRST_CHILD, + enums.MoveNodePositionChoices.LAST_CHILD, + ]: + if not target_document.get_abilities(user).get("move"): + message = ( + "You do not have permission to move documents " + "as a child to this target document." + ) + elif not target_document.is_root(): + if not target_document.get_parent().get_abilities(user).get("move"): + message = ( + "You do not have permission to move documents " + "as a sibling of this target document." + ) + + if message: + return drf.response.Response( + {"target_document_id": message}, + status=status.HTTP_400_BAD_REQUEST, + ) + + document.move(target_document, pos=position) + + return drf.response.Response( + {"message": "Document moved successfully."}, status=status.HTTP_200_OK + ) + @drf.decorators.action( detail=True, methods=["get", "post"], diff --git a/src/backend/core/enums.py b/src/backend/core/enums.py index 8f7e70cf..592a84a4 100644 --- a/src/backend/core/enums.py +++ b/src/backend/core/enums.py @@ -3,6 +3,7 @@ Core application enums declaration """ from django.conf import global_settings +from django.db import models from django.utils.translation import gettext_lazy as _ # In Django's code base, `LANGUAGES` is set by default with all supported languages. @@ -10,3 +11,14 @@ from django.utils.translation import gettext_lazy as _ # active in the app. # pylint: disable=no-member ALL_LANGUAGES = {language: _(name) for language, name in global_settings.LANGUAGES} + + +class MoveNodePositionChoices(models.TextChoices): + """Defines the possible positions when moving a django-treebeard node.""" + + FIRST_CHILD = "first-child", _("First child") + LAST_CHILD = "last-child", _("Last child") + FIRST_SIBLING = "first-sibling", _("First sibling") + LAST_SIBLING = "last-sibling", _("Last sibling") + LEFT = "left", _("Left") + RIGHT = "right", _("Right") diff --git a/src/backend/core/models.py b/src/backend/core/models.py index ec75922b..265b3314 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -592,6 +592,7 @@ class Document(MP_Node, BaseModel): "favorite": can_get and user.is_authenticated, "link_configuration": is_owner_or_admin, "invite_owner": RoleChoices.OWNER in roles, + "move": is_owner_or_admin, "partial_update": can_update, "retrieve": can_get, "media_auth": can_get, diff --git a/src/backend/core/tests/documents/test_api_documents_move.py b/src/backend/core/tests/documents/test_api_documents_move.py new file mode 100644 index 00000000..d093e491 --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_move.py @@ -0,0 +1,339 @@ +""" +Test moving documents within the document tree via an detail action API endpoint. +""" + +import random +from uuid import uuid4 + +from django.utils import timezone + +import pytest +from rest_framework.test import APIClient + +from core import enums, factories, models + +pytestmark = pytest.mark.django_db + + +def test_api_documents_move_anonymous_user(): + """Anonymous users should not be able to move documents.""" + document = factories.DocumentFactory() + target = factories.DocumentFactory() + + response = APIClient().post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id)}, + ) + + assert response.status_code == 401 + assert response.json() == { + "detail": "Authentication credentials were not provided." + } + + +@pytest.mark.parametrize("role", [None, "reader", "editor"]) +def test_api_documents_move_authenticated_document_no_permission(role): + """ + Authenticated users should not be able to move documents with insufficient + permissions on the origin document. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory() + target = factories.UserDocumentAccessFactory(user=user, role="owner").document + + if role: + factories.UserDocumentAccessFactory(document=document, user=user, role=role) + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id)}, + ) + + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + +def test_api_documents_move_invalid_target_string(): + """Test for moving a document to an invalid target as a random string.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.UserDocumentAccessFactory(user=user, role="owner").document + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": "non-existent-id"}, + ) + + assert response.status_code == 400 + assert response.json() == {"target_document_id": ["Must be a valid UUID."]} + + +def test_api_documents_move_invalid_target_uuid(): + """Test for moving a document to an invalid target that looks like a UUID.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.UserDocumentAccessFactory(user=user, role="owner").document + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(uuid4())}, + ) + + assert response.status_code == 400 + assert response.json() == { + "target_document_id": "Target parent document does not exist." + } + + +def test_api_documents_move_invalid_position(): + """Test moving a document to an invalid position.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.UserDocumentAccessFactory(user=user, role="owner").document + target = factories.UserDocumentAccessFactory(user=user, role="owner").document + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={ + "target_document_id": str(target.id), + "position": "invalid-position", + }, + ) + + assert response.status_code == 400 + assert response.json() == { + "position": ['"invalid-position" is not a valid choice.'] + } + + +@pytest.mark.parametrize("position", enums.MoveNodePositionChoices.values) +@pytest.mark.parametrize("target_parent_role", models.RoleChoices.values) +@pytest.mark.parametrize("target_role", models.RoleChoices.values) +def test_api_documents_move_authenticated_target_roles_mocked( + target_role, target_parent_role, position +): + """ + Authenticated users with insufficient permissions on the target document (or its + parent depending on the position chosen), should not be allowed to move documents. + """ + + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + power_roles = ["administrator", "owner"] + + document = factories.DocumentFactory(users=[(user, random.choice(power_roles))]) + children = factories.DocumentFactory.create_batch(3, parent=document) + + target_parent = factories.DocumentFactory(users=[(user, target_parent_role)]) + sibling1, target, sibling2 = factories.DocumentFactory.create_batch( + 3, parent=target_parent + ) + models.DocumentAccess.objects.create(document=target, user=user, role=target_role) + target_children = factories.DocumentFactory.create_batch(2, parent=target) + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id), "position": position}, + ) + + document.refresh_from_db() + + if ( + position in ["first-child", "last-child"] + and (target_role in power_roles or target_parent_role in power_roles) + ) or ( + position in ["first-sibling", "last-sibling", "left", "right"] + and target_parent_role in power_roles + ): + assert response.status_code == 200 + assert response.json() == {"message": "Document moved successfully."} + + match position: + case "first-child": + assert list(target.get_children()) == [document, *target_children] + case "last-child": + assert list(target.get_children()) == [*target_children, document] + case "first-sibling": + assert list(target.get_siblings()) == [ + document, + sibling1, + target, + sibling2, + ] + case "last-sibling": + assert list(target.get_siblings()) == [ + sibling1, + target, + sibling2, + document, + ] + case "left": + assert list(target.get_siblings()) == [ + sibling1, + document, + target, + sibling2, + ] + case "right": + assert list(target.get_siblings()) == [ + sibling1, + target, + document, + sibling2, + ] + case _: + raise ValueError(f"Invalid position: {position}") + + # Verify that the document's children have also been moved + assert list(document.get_children()) == children + else: + assert response.status_code == 400 + assert ( + "You do not have permission to move documents" + in response.json()["target_document_id"] + ) + assert document.is_root() is True + + +def test_api_documents_move_authenticated_deleted_document(): + """ + It should not be possible to move a deleted document or its descendants, even + for an owner. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory( + users=[(user, "owner")], deleted_at=timezone.now() + ) + child = factories.DocumentFactory(parent=document, users=[(user, "owner")]) + + target = factories.DocumentFactory(users=[(user, "owner")]) + + # Try moving the deleted document + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id)}, + ) + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + # Verify that the document has not moved + document.refresh_from_db() + assert document.is_root() is True + + # Try moving the child of the deleted document + response = client.post( + f"/api/v1.0/documents/{child.id!s}/move/", + data={"target_document_id": str(target.id)}, + ) + assert response.status_code == 403 + assert response.json() == { + "detail": "You do not have permission to perform this action." + } + + # Verify that the child has not moved + child.refresh_from_db() + assert child.is_child_of(document) is True + + +@pytest.mark.parametrize( + "position", + enums.MoveNodePositionChoices.values, +) +def test_api_documents_move_authenticated_deleted_target_as_child(position): + """ + It should not be possible to move a document as a child of a deleted target + even for a owner. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(users=[(user, "owner")]) + + target = factories.DocumentFactory( + users=[(user, "owner")], deleted_at=timezone.now() + ) + child = factories.DocumentFactory(parent=target, users=[(user, "owner")]) + + # Try moving the document to the deleted target + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id), "position": position}, + ) + + assert response.status_code == 400 + assert response.json() == { + "target_document_id": "Target parent document does not exist." + } + + # Verify that the document has not moved + document.refresh_from_db() + assert document.is_root() is True + + # Try moving the document to the child of the deleted target + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(child.id), "position": position}, + ) + assert response.status_code == 400 + assert response.json() == { + "target_document_id": "Target parent document does not exist." + } + + # Verify that the document has not moved + document.refresh_from_db() + assert document.is_root() is True + + +@pytest.mark.parametrize( + "position", + ["first-sibling", "last-sibling", "left", "right"], +) +def test_api_documents_move_authenticated_deleted_target_as_sibling(position): + """ + It should not be possible to move a document as a sibling of a deleted target document + if the user has no rigths on its parent. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document = factories.DocumentFactory(users=[(user, "owner")]) + + target_parent = factories.DocumentFactory( + users=[(user, "owner")], deleted_at=timezone.now() + ) + target = factories.DocumentFactory(users=[(user, "owner")], parent=target_parent) + + # Try moving the document as a sibling of the target + response = client.post( + f"/api/v1.0/documents/{document.id!s}/move/", + data={"target_document_id": str(target.id), "position": position}, + ) + + assert response.status_code == 400 + assert response.json() == { + "target_document_id": "Target parent document does not exist." + } + + # Verify that the document has not moved + document.refresh_from_db() + assert document.is_root() is True diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 7c530e4f..140e0042 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -36,6 +36,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": document.link_role == "editor", "retrieve": True, "update": document.link_role == "editor", @@ -90,6 +91,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": grand_parent.link_role == "editor", "retrieve": True, "update": grand_parent.link_role == "editor", @@ -175,8 +177,9 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "destroy": False, "favorite": True, "invite_owner": False, - "media_auth": True, "link_configuration": False, + "media_auth": True, + "move": False, "partial_update": document.link_role == "editor", "retrieve": True, "update": document.link_role == "editor", @@ -237,6 +240,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "favorite": True, "invite_owner": False, "link_configuration": False, + "move": False, "media_auth": True, "partial_update": grand_parent.link_role == "editor", "retrieve": True, @@ -408,6 +412,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "invite_owner": access.role == "owner", "link_configuration": access.role in ["administrator", "owner"], "media_auth": True, + "move": access.role in ["administrator", "owner"], "partial_update": access.role != "reader", "retrieve": True, "update": access.role != "reader", @@ -753,4 +758,3 @@ def test_api_documents_retrieve_numqueries_with_link_trace(django_assert_num_que assert response.status_code == 200 assert response.json()["id"] == str(document.id) - diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index b961499a..ac1fb00b 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -116,6 +116,7 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role) "favorite": False, "invite_owner": False, "media_auth": False, + "move": False, "link_configuration": False, "partial_update": False, "retrieve": False, @@ -156,6 +157,7 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": False, "retrieve": True, "update": False, @@ -195,6 +197,7 @@ def test_models_documents_get_abilities_editor(is_authenticated, reach): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": True, "retrieve": True, "update": True, @@ -223,6 +226,7 @@ def test_models_documents_get_abilities_owner(): "invite_owner": True, "link_configuration": True, "media_auth": True, + "move": True, "partial_update": True, "retrieve": True, "update": True, @@ -250,6 +254,7 @@ def test_models_documents_get_abilities_administrator(): "invite_owner": False, "link_configuration": True, "media_auth": True, + "move": True, "partial_update": True, "retrieve": True, "update": True, @@ -280,6 +285,7 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": True, "retrieve": True, "update": True, @@ -312,6 +318,7 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": False, "retrieve": True, "update": False, @@ -345,6 +352,7 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries): "invite_owner": False, "link_configuration": False, "media_auth": True, + "move": False, "partial_update": False, "retrieve": True, "update": False, diff --git a/src/backend/demo/tests/test_commands_create_demo.py b/src/backend/demo/tests/test_commands_create_demo.py index 3cd52e17..fef8a488 100644 --- a/src/backend/demo/tests/test_commands_create_demo.py +++ b/src/backend/demo/tests/test_commands_create_demo.py @@ -1,4 +1,5 @@ """Test the `create_demo` management command""" + from unittest import mock from django.core.management import call_command @@ -11,11 +12,14 @@ from core import models pytestmark = pytest.mark.django_db -@mock.patch("demo.defaults.NB_OBJECTS", { +@mock.patch( + "demo.defaults.NB_OBJECTS", + { "users": 10, "docs": 10, "max_users_per_document": 5, - } ) + }, +) @override_settings(DEBUG=True) def test_commands_create_demo(): """The create_demo management command should create objects as expected.""" From 8ccfdb3c6a5002077f5dd4296e92a75844ee93de Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Thu, 2 Jan 2025 17:20:09 +0100 Subject: [PATCH 15/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20soft=20delete?= =?UTF-8?q?=20to=20documents=20and=20refactor=20db=20queryset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we have introduced a document tree structure, it is not possible to allow deleting documents anymore as it impacts the whole subtree below the deleted document and the consequences are too big. We introduce soft delete in order to give a second thought to the document's owner (who is the only one to be allowed to delete a document). After a document is soft deleted, the owner can still see it in the trashbin (/api/v1.0/documents/trashbin). After a grace period (30 days be default) the document disappears from the trashbin and can't be restored anymore. Note that even then it is still kept in database. Cleaning the database to erase deleted documents after the grace period can be done as a maintenance script. --- CHANGELOG.md | 1 + src/backend/core/api/filters.py | 7 +- src/backend/core/api/permissions.py | 26 +- src/backend/core/api/utils.py | 23 ++ src/backend/core/api/viewsets.py | 368 +++++++++++++----- src/backend/core/factories.py | 19 + ...xcerpt.py => 0016_add_document_excerpt.py} | 2 +- .../0017_add_fields_for_soft_delete.py | 36 ++ src/backend/core/models.py | 171 ++++++-- .../test_api_document_invitations.py | 4 +- .../documents/test_api_document_versions.py | 8 +- .../test_api_documents_children_create.py | 5 +- .../test_api_documents_children_list.py | 7 +- .../documents/test_api_documents_delete.py | 37 +- .../documents/test_api_documents_list.py | 79 +++- .../test_api_documents_list_filters.py | 72 ++-- .../documents/test_api_documents_retrieve.py | 174 ++++++++- .../documents/test_api_documents_trashbin.py | 275 +++++++++++++ .../tests/test_api_utils_filter_root_paths.py | 94 +++++ .../core/tests/test_models_documents.py | 207 ++++++++-- src/backend/impress/settings.py | 10 + 21 files changed, 1373 insertions(+), 252 deletions(-) rename src/backend/core/migrations/{0015_add_document_excerpt.py => 0016_add_document_excerpt.py} (92%) create mode 100644 src/backend/core/migrations/0017_add_fields_for_soft_delete.py create mode 100644 src/backend/core/tests/documents/test_api_documents_trashbin.py create mode 100644 src/backend/core/tests/test_api_utils_filter_root_paths.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 22168164..ea87977f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to ## Added +- ✨(backend) add soft delete API endpoint to documents #516 - ✨(backend) allow organizing documents in a tree structure #516 - ✨(backend) add "excerpt" field to document list serializer #516 - ✨(backend) add github actions to manage Crowdin workflow #559 & #563 diff --git a/src/backend/core/api/filters.py b/src/backend/core/api/filters.py index fbf8229a..2f3b9a9e 100644 --- a/src/backend/core/api/filters.py +++ b/src/backend/core/api/filters.py @@ -24,7 +24,7 @@ class DocumentFilter(django_filters.FilterSet): class Meta: model = models.Document - fields = ["is_creator_me", "is_favorite", "link_reach", "title"] + fields = ["is_creator_me", "is_favorite", "title"] # pylint: disable=unused-argument def filter_is_creator_me(self, queryset, name, value): @@ -63,7 +63,4 @@ class DocumentFilter(django_filters.FilterSet): if not user.is_authenticated: return queryset - if value: - return queryset.filter(favorited_by_users__user=user) - - return queryset.exclude(favorited_by_users__user=user) + return queryset.filter(is_favorite=bool(value)) diff --git a/src/backend/core/api/permissions.py b/src/backend/core/api/permissions.py index f2080192..43a0465f 100644 --- a/src/backend/core/api/permissions.py +++ b/src/backend/core/api/permissions.py @@ -2,10 +2,11 @@ from django.core import exceptions from django.db.models import Q +from django.http import Http404 from rest_framework import permissions -from core.models import DocumentAccess, RoleChoices +from core.models import DocumentAccess, RoleChoices, get_trashbin_cutoff ACTION_FOR_METHOD_TO_PERMISSION = { "versions_detail": {"DELETE": "versions_destroy", "GET": "versions_retrieve"}, @@ -110,3 +111,26 @@ class AccessPermission(permissions.BasePermission): except KeyError: pass return abilities.get(action, False) + + +class DocumentAccessPermission(AccessPermission): + """Subclass to handle soft deletion specificities.""" + + def has_object_permission(self, request, view, obj): + """ + Return a 404 on deleted documents + - for which the trashbin cutoff is past + - for which the current user is not owner of the document or one of its ancestors + """ + if ( + deleted_at := obj.ancestors_deleted_at + ) and deleted_at < get_trashbin_cutoff(): + raise Http404 + + # Compute permission first to ensure the "user_roles" attribute is set + has_permission = super().has_object_permission(request, view, obj) + + if obj.ancestors_deleted_at and not RoleChoices.OWNER in obj.user_roles: + raise Http404 + + return has_permission diff --git a/src/backend/core/api/utils.py b/src/backend/core/api/utils.py index 53ca09eb..9fd059e1 100644 --- a/src/backend/core/api/utils.py +++ b/src/backend/core/api/utils.py @@ -11,6 +11,29 @@ import botocore from rest_framework.throttling import BaseThrottle +def filter_root_paths(paths, skip_sorting=False): + """ + Filters root paths from a list of paths representing a tree structure. + A root path is defined as a path that is not a prefix of any other path. + + Args: + paths (list of str): The list of paths. + + Returns: + list of str: The filtered list of root paths. + """ + if not skip_sorting: + paths.sort() + + root_paths = [] + for path in paths: + # If the current path is not a prefix of the last added root path, add it + if not root_paths or not path.startswith(root_paths[-1]): + root_paths.append(path) + + return root_paths + + def generate_s3_authorization_headers(key): """ Generate authorization headers for an s3 object. diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index e34b4695..fdc56014 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -8,6 +8,7 @@ from urllib.parse import urlparse from django.conf import settings from django.contrib.postgres.aggregates import ArrayAgg +from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.search import TrigramSimilarity from django.core.exceptions import ValidationError from django.core.files.storage import default_storage @@ -29,7 +30,7 @@ from django.http import Http404 import rest_framework as drf from botocore.exceptions import ClientError from django_filters import rest_framework as drf_filters -from rest_framework import filters, status +from rest_framework import filters, status, viewsets from rest_framework import response as drf_response from rest_framework.permissions import AllowAny @@ -56,7 +57,7 @@ COLLABORATION_WS_URL_PATTERN = re.compile(rf"(?:^|&)room=(?P{UUID_REGEX})(?: # pylint: disable=too-many-ancestors -class NestedGenericViewSet(drf.viewsets.GenericViewSet): +class NestedGenericViewSet(viewsets.GenericViewSet): """ A generic Viewset aims to be used in a nested route context. e.g: `/api/v1.0/resource_1//resource_2//` @@ -137,7 +138,7 @@ class Pagination(drf.pagination.PageNumberPagination): class UserViewSet( - drf.mixins.UpdateModelMixin, drf.viewsets.GenericViewSet, drf.mixins.ListModelMixin + drf.mixins.UpdateModelMixin, viewsets.GenericViewSet, drf.mixins.ListModelMixin ): """User ViewSet""" @@ -315,118 +316,242 @@ class DocumentMetadata(drf.metadata.SimpleMetadata): class DocumentViewSet( drf.mixins.CreateModelMixin, drf.mixins.DestroyModelMixin, + drf.mixins.ListModelMixin, drf.mixins.UpdateModelMixin, - drf.viewsets.GenericViewSet, + viewsets.GenericViewSet, ): """ - Document ViewSet for managing documents. + DocumentViewSet API. - Provides endpoints for creating, updating, and deleting documents, - along with filtering options. + This view set provides CRUD operations and additional actions for managing documents. + Supports filtering, ordering, and annotations for enhanced querying capabilities. - Filtering: + ### API Endpoints: + 1. **List**: Retrieve a paginated list of documents. + Example: GET /documents/?page=2 + 2. **Retrieve**: Get a specific document by its ID. + Example: GET /documents/{id}/ + 3. **Create**: Create a new document. + Example: POST /documents/ + 4. **Update**: Update a document by its ID. + Example: PUT /documents/{id}/ + 5. **Delete**: Soft delete a document by its ID. + Example: DELETE /documents/{id}/ + + ### Additional Actions: + 1. **Trashbin**: List soft deleted documents for a document owner + Example: GET /documents/{id}/trashbin/ + + 2. **Children**: List or create child documents. + Example: GET, POST /documents/{id}/children/ + + 3. **Versions List**: Retrieve version history of a document. + Example: GET /documents/{id}/versions/ + + 4. **Version Detail**: Get or delete a specific document version. + Example: GET, DELETE /documents/{id}/versions/{version_id}/ + + 5. **Favorite**: Get list of favorite documents for a user. Mark or unmark + a document as favorite. + Examples: + - GET /documents/favorite/ + - POST, DELETE /documents/{id}/favorite/ + + 6. **Create for Owner**: Create a document via server-to-server on behalf of a user. + Example: POST /documents/create-for-owner/ + + 7. **Link Configuration**: Update document link configuration. + Example: PUT /documents/{id}/link-configuration/ + + 8. **Attachment Upload**: Upload a file attachment for the document. + Example: POST /documents/{id}/attachment-upload/ + + 9. **Media Auth**: Authorize access to document media. + Example: GET /documents/media-auth/ + + 10. **Collaboration Auth**: Authorize access to the collaboration server for a document. + Example: GET /documents/collaboration-auth/ + + 11. **AI Transform**: Apply a transformation action on a piece of text with AI. + Example: POST /documents/{id}/ai-transform/ + Expected data: + - text (str): The input text. + - action (str): The transformation type, one of [prompt, correct, rephrase, summarize]. + Returns: JSON response with the processed text. + Throttled by: AIDocumentRateThrottle, AIUserRateThrottle. + + 12. **AI Translate**: Translate a piece of text with AI. + Example: POST /documents/{id}/ai-translate/ + Expected data: + - text (str): The input text. + - language (str): The target language, chosen from settings.LANGUAGES. + Returns: JSON response with the translated text. + Throttled by: AIDocumentRateThrottle, AIUserRateThrottle. + + ### Ordering: created_at, updated_at, is_favorite, title + + Example: + - Ascending: GET /api/v1.0/documents/?ordering=created_at + - Desceding: GET /api/v1.0/documents/?ordering=-title + + ### Filtering: - `is_creator_me=true`: Returns documents created by the current user. - `is_creator_me=false`: Returns documents created by other users. - `is_favorite=true`: Returns documents marked as favorite by the current user - `is_favorite=false`: Returns documents not marked as favorite by the current user - `title=hello`: Returns documents which title contains the "hello" string - Example Usage: + Example: - GET /api/v1.0/documents/?is_creator_me=true&is_favorite=true - GET /api/v1.0/documents/?is_creator_me=false&title=hello + + ### Annotations: + 1. **is_favorite**: Indicates whether the document is marked as favorite by the current user. + 2. **user_roles**: Roles the current user has on the document or its ancestors. + + ### Notes: + - Only the highest ancestor in a document hierarchy is shown in list views. + - Implements soft delete logic to retain document tree structures. """ - filter_backends = [drf_filters.DjangoFilterBackend, filters.OrderingFilter] + filter_backends = [drf_filters.DjangoFilterBackend] filterset_class = DocumentFilter metadata_class = DocumentMetadata ordering = ["-updated_at"] - ordering_fields = ["created_at", "is_favorite", "updated_at", "title"] + ordering_fields = ["created_at", "updated_at", "title"] permission_classes = [ - permissions.AccessPermission, + permissions.DocumentAccessPermission, ] queryset = models.Document.objects.all() serializer_class = serializers.DocumentSerializer def get_serializer_class(self): """ - Use ListDocumentSerializer for list actions, otherwise use DocumentSerializer. + Use ListDocumentSerializer for list actions; otherwise, use DocumentSerializer. """ - if self.action == "list": - return serializers.ListDocumentSerializer - return self.serializer_class - - def annotate_queryset(self, queryset): - """Annotate document queryset with favorite and number of accesses.""" - user = self.request.user - - # Annotate the number of accesses taking into account ancestors - ancestor_accesses_query = ( - models.DocumentAccess.objects.filter( - document__path=Left(OuterRef("path"), Length("document__path")), - ) - .order_by() - .annotate(total_accesses=Func(Value("id"), function="COUNT")) - .values("total_accesses") + return ( + serializers.ListDocumentSerializer + if self.action == "list" + else self.serializer_class ) - # Annotate with the number of accesses, default to 0 if no accesses exist - queryset = queryset.annotate(nb_accesses=Subquery(ancestor_accesses_query)) - - if not user.is_authenticated: - # If the user is not authenticated, annotate `is_favorite` as False - return queryset.annotate(is_favorite=Value(False)) - - # Annotate the queryset to indicate if the document is favorited by the current user - favorite_exists = models.DocumentFavorite.objects.filter( - document_id=OuterRef("pk"), user=user - ) - return queryset.annotate(is_favorite=Exists(favorite_exists)) - - def get_queryset(self): - """Optimize queryset to include favorite status for the current user.""" - queryset = super().get_queryset() - queryset = self.annotate_queryset(queryset) - return queryset.distinct() - - def list(self, request, *args, **kwargs): - """Restrict resources returned by the list endpoint""" - queryset = self.filter_queryset(self.get_queryset()) + def annotate_is_favorite(self, queryset): + """ + Annotate document queryset with the favorite status for the current user. + """ user = self.request.user if user.is_authenticated: - queryset = queryset.filter( - db.Q(accesses__user=user) - | db.Q(accesses__team__in=user.teams) - | ( - db.Q(link_traces__user=user) - & ~db.Q(link_reach=models.LinkReachChoices.RESTRICTED) + favorite_exists_subquery = models.DocumentFavorite.objects.filter( + document_id=db.OuterRef("pk"), user=user + ) + return queryset.annotate(is_favorite=db.Exists(favorite_exists_subquery)) + + return queryset.annotate(is_favorite=db.Value(False)) + + def annotate_user_roles(self, queryset): + """ + Annotate document queryset with the roles of the current user + on the document or its ancestors. + """ + user = self.request.user + output_field = ArrayField(base_field=db.CharField()) + + if user.is_authenticated: + user_roles_subquery = models.DocumentAccess.objects.filter( + db.Q(user=user) | db.Q(team__in=user.teams), + document__path=Left(db.OuterRef("path"), Length("document__path")), + ).values_list("role", flat=True) + + return queryset.annotate( + user_roles=db.Func( + user_roles_subquery, function="ARRAY", output_field=output_field ) ) - # Among the results, we may have documents that are ancestors/children of each other - # In this case we want to keep only the highest ancestor. Let's annotate, each document - # with the path of its highest ancestor within results so we can use it to filter - shortest_path = Subquery( - queryset.filter(path=Left(OuterRef("path"), Length("path"))) - .order_by("path") # Get the shortest (root) path - .values("path")[:1] - ) - queryset = queryset.annotate(root_path=shortest_path) + return queryset.annotate( + user_roles=db.Value([], output_field=output_field), + ) - # Filter documents based on their shortest path (root path) - queryset = queryset.filter( - root_path=F( - "path" - ) # Keep only documents who are the annotated highest ancestor + def get_queryset(self): + """Get queryset performing all annotation and filtering on the document tree structure.""" + user = self.request.user + queryset = super().get_queryset() + + # Only list views need filtering and annotation + if self.detail: + return queryset + + if not user.is_authenticated: + return queryset.none() + + queryset = queryset.filter(ancestors_deleted_at__isnull=True) + + # Filter documents to which the current user has access... + access_documents_ids = models.DocumentAccess.objects.filter( + db.Q(user=user) | db.Q(team__in=user.teams) + ).values_list("document_id", flat=True) + + # ...or that were previously accessed and are not restricted + traced_documents_ids = models.LinkTrace.objects.filter(user=user).values_list( + "document_id", flat=True + ) + + return queryset.filter( + db.Q(id__in=access_documents_ids) + | ( + db.Q(id__in=traced_documents_ids) + & ~db.Q(link_reach=models.LinkReachChoices.RESTRICTED) + ) + ) + + def filter_queryset(self, queryset): + """Apply annotations and filters sequentially.""" + filterset = DocumentFilter( + self.request.GET, queryset=queryset, request=self.request + ) + filterset.is_valid() + filter_data = filterset.form.cleaned_data + + # Filter as early as possible on fields that are available on the model + for field in ["is_creator_me", "title"]: + queryset = filterset.filters[field].filter(queryset, filter_data[field]) + + queryset = self.annotate_user_roles(queryset) + + if self.action == "list": + # Among the results, we may have documents that are ancestors/descendants + # of each other. In this case we want to keep only the highest ancestors. + root_paths = utils.filter_root_paths( + queryset.order_by("path").values_list("path", flat=True), + skip_sorting=True, + ) + queryset = queryset.filter(path__in=root_paths) + + # Annotate the queryset with an attribute marking instances as highest ancestor + # in order to save some time while computing abilities in the instance + queryset = queryset.annotate( + is_highest_ancestor_for_user=db.Value( + True, output_field=db.BooleanField() + ) ) - else: - queryset = queryset.none() + # Annotate favorite status and filter if applicable as late as possible + queryset = self.annotate_is_favorite(queryset) + queryset = filterset.filters["is_favorite"].filter( + queryset, filter_data["is_favorite"] + ) + # Apply ordering only now that everyting is filtered and annotated + return filters.OrderingFilter().filter_queryset(self.request, queryset, self) + + def get_response_for_queryset(self, queryset): + """Return paginated response for the queryset if requested.""" page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) + result = self.get_paginated_response(serializer.data) + return result serializer = self.get_serializer(queryset, many=True) return drf.response.Response(serializer.data) @@ -437,20 +562,18 @@ class DocumentViewSet( on a user's list view even though the user has no specific role in the document (link access when the link reach configuration of the document allows it). """ + user = self.request.user instance = self.get_object() serializer = self.get_serializer(instance) - if self.request.user.is_authenticated: - try: - # Add a trace that the user visited the document (this is needed to include - # the document in the user's list view) - models.LinkTrace.objects.create( - document=instance, - user=self.request.user, - ) - except ValidationError: - # The trace already exists, so we just pass without doing anything - pass + # The `create` query generates 5 db queries which are much less efficient than an + # `exists` query. The user will visit the document many times after the first visit + # so that's what we should optimize for. + if ( + user.is_authenticated + and not instance.link_traces.filter(user=user).exists() + ): + models.LinkTrace.objects.create(document=instance, user=request.user) return drf.response.Response(serializer.data) @@ -467,6 +590,47 @@ class DocumentViewSet( role=models.RoleChoices.OWNER, ) + def perform_destroy(self, instance): + """Override to implement a soft delete instead of dumping the record in database.""" + instance.soft_delete() + + @drf.decorators.action( + detail=False, + methods=["get"], + ) + def favorite_list(self, request, *args, **kwargs): + """Get list of favorite documents for the current user.""" + user = request.user + + favorite_documents_ids = models.DocumentFavorite.objects.filter( + user=user + ).values_list("document_id", flat=True) + + queryset = self.get_queryset() + queryset = queryset.filter(id__in=favorite_documents_ids) + return self.get_response_for_queryset(queryset) + + @drf.decorators.action( + detail=False, + methods=["get"], + serializer_class=serializers.ListDocumentSerializer, + ) + def trashbin(self, request, *args, **kwargs): + """ + Retrieve soft-deleted documents for which the current user has the owner role. + + The selected documents are those deleted within the cutoff period defined in the + settings (see TRASHBIN_CUTOFF_DAYS), before they are considered permanently deleted. + """ + queryset = self.queryset.filter( + deleted_at__isnull=False, + deleted_at__gte=models.get_trashbin_cutoff(), + ) + queryset = self.annotate_user_roles(queryset) + queryset = queryset.filter(user_roles__contains=[models.RoleChoices.OWNER]) + + return self.get_response_for_queryset(queryset) + @drf.decorators.action( authentication_classes=[authentication.ServerToServerAuthentication], detail=False, @@ -553,6 +717,7 @@ class DocumentViewSet( @drf.decorators.action( detail=True, methods=["get", "post"], + ordering=["path"], serializer_class=serializers.ListDocumentSerializer, url_path="children", ) @@ -586,16 +751,11 @@ class DocumentViewSet( ) # GET: List children - queryset = document.get_children() - queryset = self.annotate_queryset(queryset) - - page = self.paginate_queryset(queryset) - if page is not None: - serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) - - serializer = self.get_serializer(queryset, many=True) - return drf.response.Response(serializer.data) + queryset = document.get_children().filter(deleted_at__isnull=True) + queryset = self.filter_queryset(queryset) + queryset = self.annotate_is_favorite(queryset) + queryset = self.annotate_user_roles(queryset) + return self.get_response_for_queryset(queryset) @drf.decorators.action(detail=True, methods=["get"], url_path="versions") def versions_list(self, request, *args, **kwargs): @@ -617,7 +777,7 @@ class DocumentViewSet( # document. Filter to get the minimum access date for the logged-in user access_queryset = models.DocumentAccess.objects.filter( db.Q(user=user) | db.Q(team__in=user.teams), - document__path=Left(Value(document.path), Length("document__path")), + document__path=Left(db.Value(document.path), Length("document__path")), ).aggregate(min_date=db.Min("created_at")) # Handle the case where the user has no accesses @@ -657,7 +817,7 @@ class DocumentViewSet( access.created_at for access in models.DocumentAccess.objects.filter( db.Q(user=user) | db.Q(team__in=user.teams), - document__path=Left(Value(document.path), Length("document__path")), + document__path=Left(db.Value(document.path), Length("document__path")), ) ) @@ -948,7 +1108,7 @@ class DocumentAccessViewSet( drf.mixins.ListModelMixin, drf.mixins.RetrieveModelMixin, drf.mixins.UpdateModelMixin, - drf.viewsets.GenericViewSet, + viewsets.GenericViewSet, ): """ API ViewSet for all interactions with document accesses. @@ -1021,7 +1181,7 @@ class TemplateViewSet( drf.mixins.DestroyModelMixin, drf.mixins.RetrieveModelMixin, drf.mixins.UpdateModelMixin, - drf.viewsets.GenericViewSet, + viewsets.GenericViewSet, ): """Template ViewSet""" @@ -1045,14 +1205,14 @@ class TemplateViewSet( user_roles_query = ( models.TemplateAccess.objects.filter( - Q(user=user) | Q(team__in=user.teams), - template_id=OuterRef("pk"), + db.Q(user=user) | db.Q(team__in=user.teams), + template_id=db.OuterRef("pk"), ) .values("template") .annotate(roles_array=ArrayAgg("role")) .values("roles_array") ) - return queryset.annotate(user_roles=Subquery(user_roles_query)).distinct() + return queryset.annotate(user_roles=db.Subquery(user_roles_query)).distinct() def list(self, request, *args, **kwargs): """Restrict templates returned by the list endpoint""" @@ -1092,7 +1252,7 @@ class TemplateAccessViewSet( drf.mixins.ListModelMixin, drf.mixins.RetrieveModelMixin, drf.mixins.UpdateModelMixin, - drf.viewsets.GenericViewSet, + viewsets.GenericViewSet, ): """ API ViewSet for all interactions with template accesses. @@ -1132,7 +1292,7 @@ class InvitationViewset( drf.mixins.RetrieveModelMixin, drf.mixins.DestroyModelMixin, drf.mixins.UpdateModelMixin, - drf.viewsets.GenericViewSet, + viewsets.GenericViewSet, ): """API ViewSet for user invitations to document. diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index 2a6ad53a..3f2c085f 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -77,6 +77,7 @@ class DocumentFactory(factory.django.DjangoModelFactory): excerpt = factory.Sequence(lambda n: f"excerpt{n}") content = factory.Sequence(lambda n: f"content{n}") creator = factory.SubFactory(UserFactory) + deleted_at = None link_reach = factory.fuzzy.FuzzyChoice( [a[0] for a in models.LinkReachChoices.choices] ) @@ -94,11 +95,19 @@ class DocumentFactory(factory.django.DjangoModelFactory): if parent: # Add as a child node + kwargs["ancestors_deleted_at"] = ( + kwargs.get("ancestors_deleted_at") or parent.ancestors_deleted_at + ) return parent.add_child(instance=model_class(**kwargs)) # Add as a root node return model_class.add_root(instance=model_class(**kwargs)) + @factory.lazy_attribute + def ancestors_deleted_at(self): + """Should always be set when "deleted_at" is set.""" + return self.deleted_at + @factory.post_generation def users(self, create, extracted, **kwargs): """Add users to document from a given list of users with or without roles.""" @@ -109,6 +118,16 @@ class DocumentFactory(factory.django.DjangoModelFactory): else: UserDocumentAccessFactory(document=self, user=item[0], role=item[1]) + @factory.post_generation + def teams(self, create, extracted, **kwargs): + """Add teams to document from a given list of teams with or without roles.""" + if create and extracted: + for item in extracted: + if isinstance(item, str): + TeamDocumentAccessFactory(document=self, team=item) + else: + TeamDocumentAccessFactory(document=self, team=item[0], role=item[1]) + @factory.post_generation def link_traces(self, create, extracted, **kwargs): """Add link traces to document from a given list of users.""" diff --git a/src/backend/core/migrations/0015_add_document_excerpt.py b/src/backend/core/migrations/0016_add_document_excerpt.py similarity index 92% rename from src/backend/core/migrations/0015_add_document_excerpt.py rename to src/backend/core/migrations/0016_add_document_excerpt.py index 916e4be2..302cd260 100644 --- a/src/backend/core/migrations/0015_add_document_excerpt.py +++ b/src/backend/core/migrations/0016_add_document_excerpt.py @@ -6,7 +6,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('core', '0014_set_path_on_existing_documents'), + ('core', '0015_set_path_on_existing_documents'), ] operations = [ diff --git a/src/backend/core/migrations/0017_add_fields_for_soft_delete.py b/src/backend/core/migrations/0017_add_fields_for_soft_delete.py new file mode 100644 index 00000000..54c9df5c --- /dev/null +++ b/src/backend/core/migrations/0017_add_fields_for_soft_delete.py @@ -0,0 +1,36 @@ +# Generated by Django 5.1.4 on 2025-01-12 14:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0016_add_document_excerpt'), + ] + + operations = [ + migrations.AlterModelOptions( + name='document', + options={'ordering': ('path',), 'verbose_name': 'Document', 'verbose_name_plural': 'Documents'}, + ), + migrations.AddField( + model_name='document', + name='ancestors_deleted_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='document', + name='deleted_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='user', + name='language', + field=models.CharField(choices="(('en-us', 'English'), ('fr-fr', 'French'), ('de-de', 'German'))", default='en-us', help_text='The language in which the user wants to see the interface.', max_length=10, verbose_name='language'), + ), + migrations.AddConstraint( + model_name='document', + constraint=models.CheckConstraint(condition=models.Q(('deleted_at__isnull', True), ('deleted_at', models.F('ancestors_deleted_at')), _connector='OR'), name='check_deleted_at_matches_ancestors_deleted_at_when_set'), + ), + ] diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 265b3314..fca9cfcc 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -13,15 +13,13 @@ from django.conf import settings from django.contrib.auth import models as auth_models from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.sites.models import Site -from django.core import exceptions, mail, validators +from django.core import mail, validators +from django.core.cache import cache from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.core.mail import send_mail -from django.db import models +from django.db import models, transaction from django.db.models.functions import Left, Length -from django.http import FileResponse -from django.template.base import Template as DjangoTemplate -from django.template.context import Context from django.template.loader import render_to_string from django.utils import timezone from django.utils.functional import cached_property, lazy @@ -29,12 +27,27 @@ from django.utils.translation import get_language, override from django.utils.translation import gettext_lazy as _ from botocore.exceptions import ClientError +from rest_framework.exceptions import ValidationError from timezone_field import TimeZoneField from treebeard.mp_tree import MP_Node logger = getLogger(__name__) +def get_trashbin_cutoff(): + """ + Calculate the cutoff datetime for soft-deleted items based on the retention policy. + + The function returns the current datetime minus the number of days specified in + the TRASHBIN_CUTOFF_DAYS setting, indicating the oldest date for items that can + remain in the trash bin. + + Returns: + datetime: The cutoff datetime for soft-deleted items. + """ + return timezone.now() - timedelta(days=settings.TRASHBIN_CUTOFF_DAYS) + + class LinkRoleChoices(models.TextChoices): """Defines the possible roles a link can offer on a document.""" @@ -374,6 +387,8 @@ class Document(MP_Node, BaseModel): blank=True, null=True, ) + deleted_at = models.DateTimeField(null=True, blank=True) + ancestors_deleted_at = models.DateTimeField(null=True, blank=True) _content = None @@ -389,6 +404,15 @@ class Document(MP_Node, BaseModel): ordering = ("path",) verbose_name = _("Document") verbose_name_plural = _("Documents") + constraints = [ + models.CheckConstraint( + check=( + models.Q(deleted_at__isnull=True) + | models.Q(deleted_at=models.F("ancestors_deleted_at")) + ), + name="check_deleted_at_matches_ancestors_deleted_at_when_set", + ), + ] def __str__(self): return str(self.title) if self.title else str(_("Untitled Document")) @@ -527,6 +551,32 @@ class Document(MP_Node, BaseModel): Bucket=default_storage.bucket_name, Key=self.file_key, VersionId=version_id ) + def get_nb_accesses_cache_key(self): + """Generate a unique cache key for each document.""" + return f"document_{self.id!s}_nb_accesses" + + @property + def nb_accesses(self): + """Calculate the number of accesses.""" + cache_key = self.get_nb_accesses_cache_key() + nb_accesses = cache.get(cache_key) + + if nb_accesses is None: + nb_accesses = DocumentAccess.objects.filter( + document__path=Left(models.Value(self.path), Length("document__path")), + ).count() + cache.set(cache_key, nb_accesses) + + return nb_accesses + + def invalidate_nb_accesses_cache(self): + """ + Invalidate the cache for number of accesses, including on affected descendants. + """ + for document in Document.objects.filter(path__startswith=self.path).only("id"): + cache_key = document.get_nb_accesses_cache_key() + cache.delete(cache_key) + def get_roles(self, user): """Return the roles a user has on a document.""" if not user.is_authenticated: @@ -546,60 +596,78 @@ class Document(MP_Node, BaseModel): roles = [] return roles + @cached_property + def links_definitions(self): + """Get links reach/role definitions for the current document and its ancestors.""" + links_definitions = {self.link_reach: {self.link_role}} + + # Ancestors links definitions are only interesting if the document is not the highest + # ancestor to which the current user has access. Look for the annotation: + if self.depth > 1 and not getattr(self, "is_highest_ancestor_for_user", False): + for ancestor in self.get_ancestors().values("link_reach", "link_role"): + links_definitions.setdefault(ancestor["link_reach"], set()).add( + ancestor["link_role"] + ) + + return links_definitions + def get_abilities(self, user): """ Compute and return abilities for a given user on the document. """ - roles = set(self.get_roles(user)) + roles = set( + self.get_roles(user) + ) # at this point only roles based on specific access - # Compute version roles before adding link roles because we don't + # Characteristics that are based only on specific access + is_owner = RoleChoices.OWNER in roles + is_deleted = self.ancestors_deleted_at and not is_owner + is_owner_or_admin = (is_owner or RoleChoices.ADMIN in roles) and not is_deleted + + # Compute access roles before adding link roles because we don't # want anonymous users to access versions (we wouldn't know from # which date to allow them anyway) # Anonymous users should also not see document accesses - has_role = bool(roles) + has_access_role = bool(roles) and not is_deleted # Add roles provided by the document link, taking into account its ancestors - link_reaches = list(self.get_ancestors().values("link_reach", "link_role")) - link_reaches.append( - {"link_reach": self.link_reach, "link_role": self.link_role} + + # Add roles provided by the document link + links_definitions = self.links_definitions + public_roles = links_definitions.get(LinkReachChoices.PUBLIC, set()) + authenticated_roles = ( + links_definitions.get(LinkReachChoices.AUTHENTICATED, set()) + if user.is_authenticated + else set() ) + roles = roles | public_roles | authenticated_roles - for lr in link_reaches: - if lr["link_reach"] == LinkReachChoices.PUBLIC: - roles.add(lr["link_role"]) - - if user.is_authenticated: - for lr in link_reaches: - if lr["link_reach"] == LinkReachChoices.AUTHENTICATED: - roles.add(lr["link_role"]) - - is_owner_or_admin = bool( - roles.intersection({RoleChoices.OWNER, RoleChoices.ADMIN}) - ) - can_get = bool(roles) - can_update = is_owner_or_admin or RoleChoices.EDITOR in roles + can_get = bool(roles) and not is_deleted + can_update = ( + is_owner_or_admin or RoleChoices.EDITOR in roles + ) and not is_deleted return { "accesses_manage": is_owner_or_admin, - "accesses_view": has_role, + "accesses_view": has_access_role, "ai_transform": can_update, "ai_translate": can_update, "attachment_upload": can_update, "children_list": can_get, "children_create": can_update and user.is_authenticated, "collaboration_auth": can_get, - "destroy": RoleChoices.OWNER in roles, + "destroy": is_owner, "favorite": can_get and user.is_authenticated, "link_configuration": is_owner_or_admin, - "invite_owner": RoleChoices.OWNER in roles, - "move": is_owner_or_admin, + "invite_owner": is_owner, + "move": is_owner_or_admin and not self.ancestors_deleted_at, "partial_update": can_update, "retrieve": can_get, "media_auth": can_get, "update": can_update, "versions_destroy": is_owner_or_admin, - "versions_list": has_role, - "versions_retrieve": has_role, + "versions_list": has_access_role, + "versions_retrieve": has_access_role, } def send_email(self, subject, emails, context=None, language=None): @@ -660,6 +728,31 @@ class Document(MP_Node, BaseModel): self.send_email(subject, [email], context, language) + @transaction.atomic + def soft_delete(self): + """ + Soft delete the document, marking the deletion on descendants. + We still keep the .delete() method untouched for programmatic purposes. + """ + if self.deleted_at or self.ancestors_deleted_at: + raise RuntimeError( + "This document is already deleted or has deleted ancestors." + ) + + # Check if any ancestors are deleted + if self.get_ancestors().filter(deleted_at__isnull=False).exists(): + raise RuntimeError( + "Cannot delete this document because one or more ancestors are already deleted." + ) + + self.ancestors_deleted_at = self.deleted_at = timezone.now() + self.save() + + # Mark all descendants as soft deleted + self.get_descendants().filter(ancestors_deleted_at__isnull=True).update( + ancestors_deleted_at=self.ancestors_deleted_at + ) + class LinkTrace(BaseModel): """ @@ -762,6 +855,16 @@ class DocumentAccess(BaseAccess): def __str__(self): return f"{self.user!s} is {self.role:s} in document {self.document!s}" + def save(self, *args, **kwargs): + """Override save to clear the document's cache for number of accesses.""" + super().save(*args, **kwargs) + self.document.invalidate_nb_accesses_cache() + + def delete(self, *args, **kwargs): + """Override delete to clear the document's cache for number of accesses.""" + super().delete(*args, **kwargs) + self.document.invalidate_nb_accesses_cache() + def get_abilities(self, user): """ Compute and return abilities for a given user on the document access. @@ -792,7 +895,7 @@ class Template(BaseModel): return self.title def get_roles(self, user): - """Return the roles a user has on a resource.""" + """Return the roles a user has on a resource as an iterable.""" if not user.is_authenticated: return [] @@ -915,8 +1018,8 @@ class Invitation(BaseModel): User.objects.filter(email=self.email).exists() and not settings.OIDC_ALLOW_DUPLICATE_EMAILS ): - raise exceptions.ValidationError( - {"email": _("This email is already associated to a registered user.")} + raise ValidationError( + {"email": [_("This email is already associated to a registered user.")]} ) @property diff --git a/src/backend/core/tests/documents/test_api_document_invitations.py b/src/backend/core/tests/documents/test_api_document_invitations.py index 6542330d..b30d0a48 100644 --- a/src/backend/core/tests/documents/test_api_document_invitations.py +++ b/src/backend/core/tests/documents/test_api_document_invitations.py @@ -624,7 +624,9 @@ def test_api_document_invitations_create_cannot_invite_existing_users(): ) assert response.status_code == 400 - assert response.json() == ["This email is already associated to a registered user."] + assert response.json() == { + "email": ["This email is already associated to a registered user."] + } # Update diff --git a/src/backend/core/tests/documents/test_api_document_versions.py b/src/backend/core/tests/documents/test_api_document_versions.py index cb727a1d..4546d18c 100644 --- a/src/backend/core/tests/documents/test_api_document_versions.py +++ b/src/backend/core/tests/documents/test_api_document_versions.py @@ -604,15 +604,19 @@ def test_api_document_versions_update_authenticated_related(via, mock_user_teams # Delete -def test_api_document_versions_delete_anonymous(): +@pytest.mark.parametrize("reach", models.LinkReachChoices.values) +def test_api_document_versions_delete_anonymous(reach): """Anonymous users should not be allowed to destroy a document version.""" - access = factories.UserDocumentAccessFactory() + access = factories.UserDocumentAccessFactory(document__link_reach=reach) response = APIClient().delete( f"/api/v1.0/documents/{access.document_id!s}/versions/{access.id!s}/", ) assert response.status_code == 401 + assert response.json() == { + "detail": "Authentication credentials were not provided." + } @pytest.mark.parametrize("reach", models.LinkReachChoices.values) diff --git a/src/backend/core/tests/documents/test_api_documents_children_create.py b/src/backend/core/tests/documents/test_api_documents_children_create.py index 775b132a..6cfb3764 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_create.py +++ b/src/backend/core/tests/documents/test_api_documents_children_create.py @@ -31,8 +31,11 @@ def test_api_documents_children_create_anonymous(reach, role, depth): }, ) - assert response.status_code == 401 assert Document.objects.count() == depth + assert response.status_code == 401 + assert response.json() == { + "detail": "Authentication credentials were not provided." + } @pytest.mark.parametrize("depth", [1, 2, 3]) diff --git a/src/backend/core/tests/documents/test_api_documents_children_list.py b/src/backend/core/tests/documents/test_api_documents_children_list.py index 81c3f3c1..846fc9dc 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_list.py +++ b/src/backend/core/tests/documents/test_api_documents_children_list.py @@ -305,7 +305,7 @@ def test_api_documents_children_list_authenticated_related_direct(): client.force_login(user) document = factories.DocumentFactory() - factories.UserDocumentAccessFactory(document=document, user=user) + access = factories.UserDocumentAccessFactory(document=document, user=user) factories.UserDocumentAccessFactory(document=document) child1, child2 = factories.DocumentFactory.create_batch(2, parent=document) @@ -378,7 +378,6 @@ def test_api_documents_children_list_authenticated_related_parent(): grand_parent_access = factories.UserDocumentAccessFactory( document=grand_parent, user=user ) - factories.UserDocumentAccessFactory(document=grand_parent, user=user) response = client.get( f"/api/v1.0/documents/{document.id!s}/children/", @@ -400,7 +399,7 @@ def test_api_documents_children_list_authenticated_related_parent(): "link_reach": child1.link_reach, "link_role": child1.link_role, "numchild": 0, - "nb_accesses": 3, + "nb_accesses": 2, "path": child1.path, "title": child1.title, "updated_at": child1.updated_at.isoformat().replace("+00:00", "Z"), @@ -417,7 +416,7 @@ def test_api_documents_children_list_authenticated_related_parent(): "link_reach": child2.link_reach, "link_role": child2.link_role, "numchild": 0, - "nb_accesses": 2, + "nb_accesses": 1, "path": child2.path, "title": child2.title, "updated_at": child2.updated_at.isoformat().replace("+00:00", "Z"), diff --git a/src/backend/core/tests/documents/test_api_documents_delete.py b/src/backend/core/tests/documents/test_api_documents_delete.py index ba12c8ff..776bbe1f 100644 --- a/src/backend/core/tests/documents/test_api_documents_delete.py +++ b/src/backend/core/tests/documents/test_api_documents_delete.py @@ -77,6 +77,37 @@ def test_api_documents_delete_authenticated_not_owner(via, role, mock_user_teams assert models.Document.objects.count() == 2 +@pytest.mark.parametrize("depth", [1, 2, 3]) +def test_api_documents_delete_authenticated_owner_of_ancestor(depth): + """ + Authenticated users should not be able to delete a document for which + they are only owner of an ancestor. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + documents = [] + for i in range(depth): + documents.append( + factories.UserDocumentAccessFactory(role="owner", user=user).document + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + + response = client.delete( + f"/api/v1.0/documents/{documents[-1].id}/", + ) + + assert response.status_code == 204 + + # Make sure it is only a soft delete + assert models.Document.objects.count() == depth + assert models.Document.objects.filter(deleted_at__isnull=True).count() == depth - 1 + assert models.Document.objects.filter(deleted_at__isnull=False).count() == 1 + + @pytest.mark.parametrize("via", VIA) def test_api_documents_delete_authenticated_owner(via, mock_user_teams): """ @@ -101,4 +132,8 @@ def test_api_documents_delete_authenticated_owner(via, mock_user_teams): ) assert response.status_code == 204 - assert models.Document.objects.exists() is False + + # Make sure it is only a soft delete + assert models.Document.objects.count() == 1 + assert models.Document.objects.filter(deleted_at__isnull=True).exists() is False + assert models.Document.objects.filter(deleted_at__isnull=False).count() == 1 diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index b9ab03c2..f09ca58c 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -3,8 +3,11 @@ Tests for Documents API endpoint in impress's core app: list """ import random +from datetime import timedelta from unittest import mock +from django.utils import timezone + import pytest from faker import Faker from rest_framework.pagination import PageNumberPagination @@ -21,7 +24,7 @@ pytestmark = pytest.mark.django_db def test_api_documents_list_anonymous(reach, role): """ Anonymous users should not be allowed to list documents whatever the - link reach and the role + link reach and link role """ factories.DocumentFactory(link_reach=reach, link_role=role) @@ -76,6 +79,7 @@ def test_api_documents_list_format(): } +# pylint: disable=too-many-locals def test_api_documents_list_authenticated_direct(django_assert_num_queries): """ Authenticated users should be able to list documents they are a direct @@ -110,17 +114,50 @@ def test_api_documents_list_authenticated_direct(django_assert_num_queries): hidden_root = factories.DocumentFactory() child3_with_access = factories.DocumentFactory(parent=hidden_root) factories.UserDocumentAccessFactory(user=user, document=child3_with_access) + child4_with_access = factories.DocumentFactory(parent=hidden_root) + factories.UserDocumentAccessFactory(user=user, document=child4_with_access) - expected_ids = {str(document1.id), str(document2.id), str(child3_with_access.id)} + # Documents that are soft deleted and children of a soft deleted document should not be listed + soft_deleted_document = factories.DocumentFactory(users=[user]) + child_of_soft_deleted_document = factories.DocumentFactory( + users=[user], + parent=soft_deleted_document, + ) + factories.DocumentFactory(users=[user], parent=child_of_soft_deleted_document) + soft_deleted_document.soft_delete() - with django_assert_num_queries(7): + # Documents that are permanently deleted and children of a permanently deleted + # document should not be listed + permanently_deleted_document = factories.DocumentFactory(users=[user]) + child_of_permanently_deleted_document = factories.DocumentFactory( + users=[user], parent=permanently_deleted_document + ) + factories.DocumentFactory( + users=[user], parent=child_of_permanently_deleted_document + ) + + fourty_days_ago = timezone.now() - timedelta(days=40) + with mock.patch("django.utils.timezone.now", return_value=fourty_days_ago): + permanently_deleted_document.soft_delete() + + expected_ids = { + str(document1.id), + str(document2.id), + str(child3_with_access.id), + str(child4_with_access.id), + } + + with django_assert_num_queries(8): + response = client.get("/api/v1.0/documents/") + + # nb_accesses should now be cached + with django_assert_num_queries(4): response = client.get("/api/v1.0/documents/") assert response.status_code == 200 results = response.json()["results"] - assert len(results) == 3 - results_id = {result["id"] for result in results} - assert expected_ids == results_id + results_ids = {result["id"] for result in results} + assert expected_ids == results_ids def test_api_documents_list_authenticated_via_team( @@ -148,7 +185,11 @@ def test_api_documents_list_authenticated_via_team( expected_ids = {str(document.id) for document in documents_team1 + documents_team2} - with django_assert_num_queries(8): + with django_assert_num_queries(9): + response = client.get("/api/v1.0/documents/") + + # nb_accesses should now be cached + with django_assert_num_queries(4): response = client.get("/api/v1.0/documents/") assert response.status_code == 200 @@ -177,10 +218,12 @@ def test_api_documents_list_authenticated_link_reach_restricted( other_document = factories.DocumentFactory(link_reach="public") models.LinkTrace.objects.create(document=other_document, user=user) + with django_assert_num_queries(5): + response = client.get("/api/v1.0/documents/") + + # nb_accesses should now be cached with django_assert_num_queries(4): - response = client.get( - "/api/v1.0/documents/", - ) + response = client.get("/api/v1.0/documents/") assert response.status_code == 200 results = response.json()["results"] @@ -225,9 +268,11 @@ def test_api_documents_list_authenticated_link_reach_public_or_authenticated( expected_ids = {str(document1.id), str(document2.id), str(visible_child.id)} with django_assert_num_queries(7): - response = client.get( - "/api/v1.0/documents/", - ) + response = client.get("/api/v1.0/documents/") + + # nb_accesses should now be cached + with django_assert_num_queries(4): + response = client.get("/api/v1.0/documents/") assert response.status_code == 200 results = response.json()["results"] @@ -317,7 +362,11 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries factories.DocumentFactory.create_batch(2, users=[user]) url = "/api/v1.0/documents/" - with django_assert_num_queries(8): + with django_assert_num_queries(9): + response = client.get(url) + + # nb_accesses should now be cached + with django_assert_num_queries(4): response = client.get(url) assert response.status_code == 200 @@ -330,7 +379,7 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries for document in special_documents: models.DocumentFavorite.objects.create(document=document, user=user) - with django_assert_num_queries(8): + with django_assert_num_queries(4): response = client.get(url) assert response.status_code == 200 diff --git a/src/backend/core/tests/documents/test_api_documents_list_filters.py b/src/backend/core/tests/documents/test_api_documents_list_filters.py index 659c3f08..f93ad6d5 100644 --- a/src/backend/core/tests/documents/test_api_documents_list_filters.py +++ b/src/backend/core/tests/documents/test_api_documents_list_filters.py @@ -86,8 +86,6 @@ def test_api_documents_list_filter_and_access_rights(): "-created_at", "is_favorite", "-is_favorite", - "nb_accesses", - "-nb_accesses", "title", "-title", "updated_at", @@ -143,8 +141,6 @@ def test_api_documents_list_ordering_by_fields(): "-created_at", "is_favorite", "-is_favorite", - "nb_accesses", - "-nb_accesses", "title", "-title", "updated_at", @@ -165,6 +161,31 @@ def test_api_documents_list_ordering_by_fields(): assert compare(results[i][field], results[i + 1][field]) +# Filters: unknown field + + +def test_api_documents_list_filter_unknown_field(): + """ + Trying to filter by an unknown field should raise a 400 error. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + factories.DocumentFactory() + expected_ids = { + str(document.id) + for document in factories.DocumentFactory.create_batch(2, users=[user]) + } + + response = client.get("/api/v1.0/documents/?unknown=true") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 2 + assert {result["id"] for result in results} == expected_ids + + # Filters: is_creator_me @@ -291,46 +312,6 @@ def test_api_documents_list_filter_is_favorite_invalid(): assert len(results) == 5 -# Filters: link_reach - - -@pytest.mark.parametrize("reach", models.LinkReachChoices.values) -def test_api_documents_list_filter_link_reach(reach): - """Authenticated users should be able to filter documents by link reach.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(5, users=[user]) - - response = client.get(f"/api/v1.0/documents/?link_reach={reach:s}") - - assert response.status_code == 200 - results = response.json()["results"] - - # Ensure all results have the chosen link reach - for result in results: - assert result["link_reach"] == reach - - -def test_api_documents_list_filter_link_reach_invalid(): - """Filtering with an invalid `link_reach` value should raise an error.""" - user = factories.UserFactory() - client = APIClient() - client.force_login(user) - - factories.DocumentFactory.create_batch(3, users=[user]) - - response = client.get("/api/v1.0/documents/?link_reach=invalid") - - assert response.status_code == 400 - assert response.json() == { - "link_reach": [ - "Select a valid choice. invalid is not one of the available choices." - ] - } - - # Filters: title @@ -360,7 +341,8 @@ def test_api_documents_list_filter_title(query, nb_results): "Annual Review 2024", ] for title in titles: - factories.DocumentFactory(title=title, users=[user]) + parent = factories.DocumentFactory() if random.choice([True, False]) else None + factories.DocumentFactory(title=title, users=[user], parent=parent) # Perform the search query response = client.get(f"/api/v1.0/documents/?title={query:s}") diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 140e0042..99682f65 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -3,6 +3,10 @@ Tests for Documents API endpoint in impress's core app: retrieve """ import random +from datetime import timedelta +from unittest import mock + +from django.utils import timezone import pytest from rest_framework.test import APIClient @@ -735,7 +739,7 @@ def test_api_documents_retrieve_user_roles(django_assert_num_queries): ) expected_roles = {access.role for access in accesses} - with django_assert_num_queries(8): + with django_assert_num_queries(10): response = client.get(f"/api/v1.0/documents/{document.id!s}/") assert response.status_code == 200 @@ -752,9 +756,175 @@ def test_api_documents_retrieve_numqueries_with_link_trace(django_assert_num_que document = factories.DocumentFactory(users=[user], link_traces=[user]) - with django_assert_num_queries(2): + with django_assert_num_queries(4): + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + with django_assert_num_queries(3): response = client.get(f"/api/v1.0/documents/{document.id!s}/") assert response.status_code == 200 assert response.json()["id"] == str(document.id) + + +# Soft/permanent delete + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("reach", models.LinkReachChoices.values) +def test_api_documents_retrieve_soft_deleted_anonymous(reach, depth): + """ + A soft/permanently deleted public document should not be accessible via its + detail endpoint for anonymous users, and should return a 404. + """ + documents = [] + for i in range(depth): + documents.append( + factories.DocumentFactory(link_reach=reach) + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + + response = APIClient().get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 200 if reach == "public" else 401 + + # Delete any one of the documents... + deleted_document = random.choice(documents) + deleted_document.soft_delete() + + response = APIClient().get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + fourty_days_ago = timezone.now() - timedelta(days=40) + deleted_document.deleted_at = fourty_days_ago + deleted_document.ancestors_deleted_at = fourty_days_ago + deleted_document.save() + + response = APIClient().get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("reach", models.LinkReachChoices.values) +def test_api_documents_retrieve_soft_deleted_authenticated(reach, depth): + """ + A soft/permanently deleted document should not be accessible via its detail endpoint for + authenticated users not related to the document. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + documents = [] + for i in range(depth): + documents.append( + factories.DocumentFactory(link_reach=reach) + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + + response = client.get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 200 if reach in ["public", "authenticated"] else 403 + + # Delete any one of the documents... + deleted_document = random.choice(documents) + deleted_document.soft_delete() + + response = client.get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + fourty_days_ago = timezone.now() - timedelta(days=40) + deleted_document.deleted_at = fourty_days_ago + deleted_document.ancestors_deleted_at = fourty_days_ago + deleted_document.save() + + response = client.get(f"/api/v1.0/documents/{documents[-1].id!s}/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("role", models.RoleChoices.values) +def test_api_documents_retrieve_soft_deleted_related(role, depth): + """ + A soft deleted document should only be accessible via its detail endpoint by + users with specific "owner" access rights. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + documents = [] + for i in range(depth): + documents.append( + factories.UserDocumentAccessFactory(role=role, user=user).document + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + document = documents[-1] + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + + # Delete any one of the documents + deleted_document = random.choice(documents) + deleted_document.soft_delete() + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + if role == "owner": + assert response.status_code == 200 + assert response.json()["id"] == str(document.id) + else: + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + +@pytest.mark.parametrize("depth", [1, 2, 3]) +@pytest.mark.parametrize("role", models.RoleChoices.values) +def test_api_documents_retrieve_permanently_deleted_related(role, depth): + """ + A permanently deleted document should not be accessible via its detail endpoint for + authenticated users with specific access rights whatever their role. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + documents = [] + for i in range(depth): + documents.append( + factories.UserDocumentAccessFactory(role=role, user=user).document + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + document = documents[-1] + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 200 + + # Delete any one of the documents + deleted_document = random.choice(documents) + fourty_days_ago = timezone.now() - timedelta(days=40) + with mock.patch("django.utils.timezone.now", return_value=fourty_days_ago): + deleted_document.soft_delete() + + response = client.get(f"/api/v1.0/documents/{document.id!s}/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} diff --git a/src/backend/core/tests/documents/test_api_documents_trashbin.py b/src/backend/core/tests/documents/test_api_documents_trashbin.py new file mode 100644 index 00000000..a05c6221 --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_trashbin.py @@ -0,0 +1,275 @@ +""" +Tests for Documents API endpoint in impress's core app: list +""" + +from datetime import timedelta +from unittest import mock + +from django.utils import timezone + +import pytest +from faker import Faker +from rest_framework.pagination import PageNumberPagination +from rest_framework.test import APIClient + +from core import factories, models + +fake = Faker() +pytestmark = pytest.mark.django_db + + +@pytest.mark.parametrize("role", models.LinkRoleChoices.values) +@pytest.mark.parametrize("reach", models.LinkReachChoices.values) +def test_api_documents_trashbin_anonymous(reach, role): + """ + Anonymous users should not be allowed to list documents from the trashbin + whatever the link reach and link role + """ + factories.DocumentFactory( + link_reach=reach, link_role=role, deleted_at=timezone.now() + ) + + response = APIClient().get("/api/v1.0/documents/trashbin/") + + assert response.status_code == 200 + assert response.json() == { + "count": 0, + "next": None, + "previous": None, + "results": [], + } + + +def test_api_documents_trashbin_format(): + """Validate the format of documents as returned by the trashbin view.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + other_users = factories.UserFactory.create_batch(3) + document = factories.DocumentFactory( + deleted_at=timezone.now(), + users=factories.UserFactory.create_batch(2), + favorited_by=[user, *other_users], + link_traces=other_users, + ) + factories.UserDocumentAccessFactory(document=document, user=user, role="owner") + + response = client.get("/api/v1.0/documents/trashbin/") + + assert response.status_code == 200 + + content = response.json() + results = content.pop("results") + assert content == { + "count": 1, + "next": None, + "previous": None, + } + assert len(results) == 1 + assert results[0] == { + "id": str(document.id), + "abilities": { + "accesses_manage": True, + "accesses_view": True, + "ai_transform": True, + "ai_translate": True, + "attachment_upload": True, + "children_create": True, + "children_list": True, + "collaboration_auth": True, + "destroy": True, + "favorite": True, + "invite_owner": True, + "link_configuration": True, + "media_auth": True, + "move": False, # Can't move a deleted document + "partial_update": True, + "retrieve": True, + "update": True, + "versions_destroy": True, + "versions_list": True, + "versions_retrieve": True, + }, + "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "creator": str(document.creator.id), + "depth": 1, + "excerpt": document.excerpt, + "link_reach": document.link_reach, + "link_role": document.link_role, + "nb_accesses": 3, + "numchild": 0, + "path": document.path, + "title": document.title, + "updated_at": document.updated_at.isoformat().replace("+00:00", "Z"), + "user_roles": ["owner"], + } + + +def test_api_documents_trashbin_authenticated_direct(django_assert_num_queries): + """ + The trashbin should only list deleted documents for which the current user is owner. + """ + now = timezone.now() + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + document1, document2 = factories.DocumentFactory.create_batch(2, deleted_at=now) + models.DocumentAccess.objects.create(document=document1, user=user, role="owner") + models.DocumentAccess.objects.create(document=document2, user=user, role="owner") + + # Unrelated documents + for reach in models.LinkReachChoices: + for role in models.LinkRoleChoices: + factories.DocumentFactory(link_reach=reach, link_role=role, deleted_at=now) + + # Role other than "owner" + for role in models.RoleChoices.values: + if role == "owner": + continue + document_not_owner = factories.DocumentFactory(deleted_at=now) + models.DocumentAccess.objects.create( + document=document_not_owner, user=user, role=role + ) + + # Nested documents should also get listed + parent = factories.DocumentFactory(parent=document1) + document3 = factories.DocumentFactory(parent=parent, deleted_at=now) + models.DocumentAccess.objects.create(document=parent, user=user, role="owner") + + # Permanently deleted documents should not be listed + fourty_days_ago = timezone.now() - timedelta(days=40) + permanently_deleted_document = factories.DocumentFactory(users=[(user, "owner")]) + with mock.patch("django.utils.timezone.now", return_value=fourty_days_ago): + permanently_deleted_document.soft_delete() + + expected_ids = {str(document1.id), str(document2.id), str(document3.id)} + + with django_assert_num_queries(7): + response = client.get("/api/v1.0/documents/trashbin/") + + with django_assert_num_queries(4): + response = client.get("/api/v1.0/documents/trashbin/") + + assert response.status_code == 200 + results = response.json()["results"] + results_ids = {result["id"] for result in results} + assert len(results) == 3 + assert expected_ids == results_ids + + +def test_api_documents_trashbin_authenticated_via_team( + django_assert_num_queries, mock_user_teams +): + """ + Authenticated users should be able to list trashbin documents they own via a team. + """ + now = timezone.now() + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + mock_user_teams.return_value = ["team1", "team2", "unknown"] + + deleted_document_team1 = factories.DocumentFactory( + teams=[("team1", "owner")], deleted_at=now + ) + factories.DocumentFactory(teams=[("team1", "owner")]) + factories.DocumentFactory(teams=[("team1", "administrator")], deleted_at=now) + factories.DocumentFactory(teams=[("team1", "administrator")]) + deleted_document_team2 = factories.DocumentFactory( + teams=[("team2", "owner")], deleted_at=now + ) + factories.DocumentFactory(teams=[("team2", "owner")]) + factories.DocumentFactory(teams=[("team2", "administrator")], deleted_at=now) + factories.DocumentFactory(teams=[("team2", "administrator")]) + + expected_ids = {str(deleted_document_team1.id), str(deleted_document_team2.id)} + + with django_assert_num_queries(5): + response = client.get("/api/v1.0/documents/trashbin/") + + with django_assert_num_queries(3): + response = client.get("/api/v1.0/documents/trashbin/") + + assert response.status_code == 200 + results = response.json()["results"] + assert len(results) == 2 + results_id = {result["id"] for result in results} + assert expected_ids == results_id + + +@mock.patch.object(PageNumberPagination, "get_page_size", return_value=2) +def test_api_documents_trashbin_pagination( + _mock_page_size, +): + """Pagination should work as expected.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + document_ids = [ + str(document.id) + for document in factories.DocumentFactory.create_batch( + 3, deleted_at=timezone.now() + ) + ] + for document_id in document_ids: + models.DocumentAccess.objects.create( + document_id=document_id, user=user, role="owner" + ) + + # Get page 1 + response = client.get("/api/v1.0/documents/trashbin/") + + assert response.status_code == 200 + content = response.json() + + assert content["count"] == 3 + assert content["next"] == "http://testserver/api/v1.0/documents/trashbin/?page=2" + assert content["previous"] is None + + assert len(content["results"]) == 2 + for item in content["results"]: + document_ids.remove(item["id"]) + + # Get page 2 + response = client.get( + "/api/v1.0/documents/trashbin/?page=2", + ) + + assert response.status_code == 200 + content = response.json() + + assert content["count"] == 3 + assert content["next"] is None + assert content["previous"] == "http://testserver/api/v1.0/documents/trashbin/" + + assert len(content["results"]) == 1 + document_ids.remove(content["results"][0]["id"]) + assert document_ids == [] + + +def test_api_documents_trashbin_distinct(): + """A document with several related users should only be listed once.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + other_user = factories.UserFactory() + document = factories.DocumentFactory( + users=[(user, "owner"), other_user], deleted_at=timezone.now() + ) + + response = client.get( + "/api/v1.0/documents/trashbin/", + ) + + assert response.status_code == 200 + content = response.json() + assert len(content["results"]) == 1 + assert content["results"][0]["id"] == str(document.id) diff --git a/src/backend/core/tests/test_api_utils_filter_root_paths.py b/src/backend/core/tests/test_api_utils_filter_root_paths.py new file mode 100644 index 00000000..1375d223 --- /dev/null +++ b/src/backend/core/tests/test_api_utils_filter_root_paths.py @@ -0,0 +1,94 @@ +""" +Unit tests for the filter_root_paths utility function. +""" + +from core.api.utils import filter_root_paths + + +def test_api_utils_filter_root_paths_success(): + """ + The `filter_root_paths` function should correctly identify root paths + from a given list of paths. + + This test uses a list of paths with missing intermediate paths to ensure that + only the minimal set of root paths is returned. + """ + paths = [ + "0001", + "00010001", + "000100010001", + "000100010002", + # missing 00010002 + "000100020001", + "000100020002", + "0002", + "00020001", + "00020002", + # missing 0003 + "00030001", + "000300010001", + "00030002", + # missing 0004 + # missing 00040001 + # missing 000400010001 + # missing 000400010002 + "000400010003", + "0004000100030001", + "000400010004", + ] + filtered_paths = filter_root_paths(paths, skip_sorting=True) + assert filtered_paths == [ + "0001", + "0002", + "00030001", + "00030002", + "000400010003", + "000400010004", + ] + + +def test_api_utils_filter_root_paths_sorting(): + """ + The `filter_root_paths` function should fail is sorting is skipped and paths are not sorted. + + This test verifies that when sorting is skipped, the function respects the input order, and + when sorting is enabled, the result is correctly ordered and minimal. + """ + paths = [ + "0001", + "00010001", + "000100010001", + "000100020002", + "000100010002", + "000100020001", + "00020001", + "0002", + "00020002", + "000300010001", + "00030001", + "00030002", + "0004000100030001", + "000400010003", + "000400010004", + ] + filtered_paths = filter_root_paths(paths, skip_sorting=True) + assert filtered_paths == [ + "0001", + "00020001", + "0002", + "000300010001", + "00030001", + "00030002", + "0004000100030001", + "000400010003", + "000400010004", + ] + filtered_paths = filter_root_paths(paths) + assert filtered_paths == [ + "0001", + "0002", + "00030001", + "00030002", + "000400010003", + "000400010004", + ] diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index ac1fb00b..a28194f3 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -2,12 +2,14 @@ Unit tests for the Document model """ +import random import smtplib from logging import Logger from unittest import mock from django.contrib.auth.models import AnonymousUser from django.core import mail +from django.core.cache import cache from django.core.exceptions import ValidationError from django.core.files.storage import default_storage from django.utils import timezone @@ -81,6 +83,44 @@ def test_models_documents_tree_alphabet(): assert models.Document.objects.count() == 124 +@pytest.mark.parametrize("depth", range(5)) +def test_models_documents_soft_delete(depth): + """Trying to delete a document that is already deleted or is a descendant of + a deleted document should raise an error. + """ + documents = [] + for i in range(depth + 1): + documents.append( + factories.DocumentFactory() + if i == 0 + else factories.DocumentFactory(parent=documents[-1]) + ) + assert models.Document.objects.count() == depth + 1 + + # Delete any one of the documents... + deleted_document = random.choice(documents) + deleted_document.soft_delete() + + with pytest.raises(RuntimeError): + documents[-1].soft_delete() + + assert deleted_document.deleted_at is not None + assert deleted_document.ancestors_deleted_at == deleted_document.deleted_at + + descendants = deleted_document.get_descendants() + for child in descendants: + assert child.deleted_at is None + assert child.ancestors_deleted_at is not None + assert child.ancestors_deleted_at == deleted_document.deleted_at + + ancestors = deleted_document.get_ancestors() + for parent in ancestors: + assert parent.deleted_at is None + assert parent.ancestors_deleted_at is None + + assert len(ancestors) + len(descendants) == depth + + # get_abilities @@ -95,15 +135,16 @@ def test_models_documents_tree_alphabet(): (False, "authenticated", "editor"), ], ) -def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role): +def test_models_documents_get_abilities_forbidden( + is_authenticated, reach, role, django_assert_num_queries +): """ Check abilities returned for a document giving insufficient roles to link holders i.e anonymous users or authenticated users who have no specific role on the document. """ document = factories.DocumentFactory(link_reach=reach, link_role=role) user = factories.UserFactory() if is_authenticated else AnonymousUser() - abilities = document.get_abilities(user) - assert abilities == { + expected_abilities = { "accesses_manage": False, "accesses_view": False, "ai_transform": False, @@ -125,6 +166,12 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role) "versions_list": False, "versions_retrieve": False, } + nb_queries = 1 if is_authenticated else 0 + with django_assert_num_queries(nb_queries): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert document.get_abilities(user) == expected_abilities @pytest.mark.parametrize( @@ -135,15 +182,16 @@ def test_models_documents_get_abilities_forbidden(is_authenticated, reach, role) (True, "authenticated"), ], ) -def test_models_documents_get_abilities_reader(is_authenticated, reach): +def test_models_documents_get_abilities_reader( + is_authenticated, reach, django_assert_num_queries +): """ Check abilities returned for a document giving reader role to link holders i.e anonymous users or authenticated users who have no specific role on the document. """ document = factories.DocumentFactory(link_reach=reach, link_role="reader") user = factories.UserFactory() if is_authenticated else AnonymousUser() - abilities = document.get_abilities(user) - assert abilities == { + expected_abilities = { "accesses_manage": False, "accesses_view": False, "ai_transform": False, @@ -165,6 +213,12 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach): "versions_list": False, "versions_retrieve": False, } + nb_queries = 1 if is_authenticated else 0 + with django_assert_num_queries(nb_queries): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert all(value is False for value in document.get_abilities(user).values()) @pytest.mark.parametrize( @@ -175,15 +229,16 @@ def test_models_documents_get_abilities_reader(is_authenticated, reach): (True, "authenticated"), ], ) -def test_models_documents_get_abilities_editor(is_authenticated, reach): +def test_models_documents_get_abilities_editor( + is_authenticated, reach, django_assert_num_queries +): """ Check abilities returned for a document giving editor role to link holders i.e anonymous users or authenticated users who have no specific role on the document. """ document = factories.DocumentFactory(link_reach=reach, link_role="editor") user = factories.UserFactory() if is_authenticated else AnonymousUser() - abilities = document.get_abilities(user) - assert abilities == { + expected_abilities = { "accesses_manage": False, "accesses_view": False, "ai_transform": True, @@ -205,14 +260,19 @@ def test_models_documents_get_abilities_editor(is_authenticated, reach): "versions_list": False, "versions_retrieve": False, } + nb_queries = 1 if is_authenticated else 0 + with django_assert_num_queries(nb_queries): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert all(value is False for value in document.get_abilities(user).values()) -def test_models_documents_get_abilities_owner(): +def test_models_documents_get_abilities_owner(django_assert_num_queries): """Check abilities returned for the owner of a document.""" user = factories.UserFactory() - access = factories.UserDocumentAccessFactory(role="owner", user=user) - abilities = access.document.get_abilities(access.user) - assert abilities == { + document = factories.DocumentFactory(users=[(user, "owner")]) + expected_abilities = { "accesses_manage": True, "accesses_view": True, "ai_transform": True, @@ -234,13 +294,19 @@ def test_models_documents_get_abilities_owner(): "versions_list": True, "versions_retrieve": True, } + with django_assert_num_queries(1): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + expected_abilities["move"] = False + assert document.get_abilities(user) == expected_abilities -def test_models_documents_get_abilities_administrator(): +def test_models_documents_get_abilities_administrator(django_assert_num_queries): """Check abilities returned for the administrator of a document.""" - access = factories.UserDocumentAccessFactory(role="administrator") - abilities = access.document.get_abilities(access.user) - assert abilities == { + user = factories.UserFactory() + document = factories.DocumentFactory(users=[(user, "administrator")]) + expected_abilities = { "accesses_manage": True, "accesses_view": True, "ai_transform": True, @@ -262,16 +328,18 @@ def test_models_documents_get_abilities_administrator(): "versions_list": True, "versions_retrieve": True, } + with django_assert_num_queries(1): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert all(value is False for value in document.get_abilities(user).values()) def test_models_documents_get_abilities_editor_user(django_assert_num_queries): """Check abilities returned for the editor of a document.""" - access = factories.UserDocumentAccessFactory(role="editor") - - with django_assert_num_queries(1): - abilities = access.document.get_abilities(access.user) - - assert abilities == { + user = factories.UserFactory() + document = factories.DocumentFactory(users=[(user, "editor")]) + expected_abilities = { "accesses_manage": False, "accesses_view": True, "ai_transform": True, @@ -293,24 +361,27 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries): "versions_list": True, "versions_retrieve": True, } + with django_assert_num_queries(1): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert all(value is False for value in document.get_abilities(user).values()) def test_models_documents_get_abilities_reader_user(django_assert_num_queries): """Check abilities returned for the reader of a document.""" - access = factories.UserDocumentAccessFactory( - role="reader", document__link_role="reader" + user = factories.UserFactory() + document = factories.DocumentFactory(users=[(user, "reader")]) + access_from_link = ( + document.link_reach != "restricted" and document.link_role == "editor" ) - - with django_assert_num_queries(1): - abilities = access.document.get_abilities(access.user) - - assert abilities == { + expected_abilities = { "accesses_manage": False, "accesses_view": True, - "ai_transform": False, - "ai_translate": False, - "attachment_upload": False, - "children_create": False, + "ai_transform": access_from_link, + "ai_translate": access_from_link, + "attachment_upload": access_from_link, + "children_create": access_from_link, "children_list": True, "collaboration_auth": True, "destroy": False, @@ -319,13 +390,18 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries): "link_configuration": False, "media_auth": True, "move": False, - "partial_update": False, + "partial_update": access_from_link, "retrieve": True, - "update": False, + "update": access_from_link, "versions_destroy": False, "versions_list": True, "versions_retrieve": True, } + with django_assert_num_queries(1): + assert document.get_abilities(user) == expected_abilities + document.soft_delete() + document.refresh_from_db() + assert all(value is False for value in document.get_abilities(user).values()) def test_models_documents_get_abilities_preset_role(django_assert_num_queries): @@ -555,3 +631,62 @@ def test_models_documents__email_invitation__failed(mock_logger, _mock_send_mail assert emails == ["guest3@example.com"] assert isinstance(exception, smtplib.SMTPException) + + +# Document number of accesses + + +def test_models_documents_nb_accesses_cache_is_set_and_retrieved( + django_assert_num_queries, +): + """Test that nb_accesses is cached after the first computation.""" + document = factories.DocumentFactory() + key = f"document_{document.id!s}_nb_accesses" + nb_accesses = random.randint(1, 4) + factories.UserDocumentAccessFactory.create_batch(nb_accesses, document=document) + factories.UserDocumentAccessFactory() # An unrelated access should not be counted + + # Initially, the nb_accesses should not be cached + assert cache.get(key) is None + + # Compute the nb_accesses for the first time (this should set the cache) + with django_assert_num_queries(1): + assert document.nb_accesses == nb_accesses + + # Ensure that the nb_accesses is now cached + with django_assert_num_queries(0): + assert document.nb_accesses == nb_accesses + assert cache.get(key) == nb_accesses + + # The cache value should be invalidated when a document access is created + models.DocumentAccess.objects.create( + document=document, user=factories.UserFactory(), role="reader" + ) + assert cache.get(key) is None # Cache should be invalidated + with django_assert_num_queries(1): + new_nb_accesses = document.nb_accesses + assert new_nb_accesses == nb_accesses + 1 + assert cache.get(key) == new_nb_accesses # Cache should now contain the new value + + +def test_models_documents_nb_accesses_cache_is_invalidated_on_access_removal( + django_assert_num_queries, +): + """Test that the cache is invalidated when a document access is deleted.""" + document = factories.DocumentFactory() + key = f"document_{document.id!s}_nb_accesses" + access = factories.UserDocumentAccessFactory(document=document) + + # Initially, the nb_accesses should be cached + assert document.nb_accesses == 1 + assert cache.get(key) == 1 + + # Remove the access and check if cache is invalidated + access.delete() + assert cache.get(key) is None # Cache should be invalidated + + # Recompute the nb_accesses (this should trigger a cache set) + with django_assert_num_queries(1): + new_nb_accesses = document.nb_accesses + assert new_nb_accesses == 0 + assert cache.get(key) == 0 # Cache should now contain the new value diff --git a/src/backend/impress/settings.py b/src/backend/impress/settings.py index 3e82a702..8f470ad9 100755 --- a/src/backend/impress/settings.py +++ b/src/backend/impress/settings.py @@ -296,6 +296,7 @@ class Base(Configuration): "drf_spectacular", # Third party apps "corsheaders", + "django_filters", "dockerflow.django", "rest_framework", "parler", @@ -351,6 +352,10 @@ class Base(Configuration): "REDOC_DIST": "SIDECAR", } + TRASHBIN_CUTOFF_DAYS = values.Value( + 30, environ_name="TRASHBIN_CUTOFF_DAYS", environ_prefix=None + ) + # Mail EMAIL_BACKEND = values.Value("django.core.mail.backends.smtp.EmailBackend") EMAIL_BRAND_NAME = values.Value(None) @@ -771,6 +776,11 @@ class Production(Base): environ_name="REDIS_URL", environ_prefix=None, ), + "TIMEOUT": values.IntegerValue( + 30, # timeout in seconds + environ_name="CACHES_DEFAULT_TIMEOUT", + environ_prefix=None, + ), "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", }, From 239342fbbd216ad2005f245f04e2555332cf31f3 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Sun, 5 Jan 2025 14:43:15 +0100 Subject: [PATCH 16/22] =?UTF-8?q?=E2=9C=A8(backend)=20add=20API=20endpoint?= =?UTF-8?q?=20action=20to=20restore=20a=20soft=20deleted=20document?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only owners can see and restore deleted documents. They can only do it during the grace period before the document is considered hard deleted and hidden from everybody on the API. --- CHANGELOG.md | 2 +- src/backend/core/api/viewsets.py | 16 +++ src/backend/core/models.py | 47 +++++++ .../documents/test_api_documents_restore.py | 126 ++++++++++++++++++ .../documents/test_api_documents_retrieve.py | 5 + .../core/tests/test_models_documents.py | 8 ++ 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/backend/core/tests/documents/test_api_documents_restore.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ea87977f..9e6bd3fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to ## Added -- ✨(backend) add soft delete API endpoint to documents #516 +- ✨(backend) add soft delete and restore API endpoints to documents #516 - ✨(backend) allow organizing documents in a tree structure #516 - ✨(backend) add "excerpt" field to document list serializer #516 - ✨(backend) add github actions to manage Crowdin workflow #559 & #563 diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index fdc56014..93f8be0f 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -714,6 +714,22 @@ class DocumentViewSet( {"message": "Document moved successfully."}, status=status.HTTP_200_OK ) + @drf.decorators.action( + detail=True, + methods=["post"], + ) + def restore(self, request, *args, **kwargs): + """ + Restore a soft-deleted document if it was deleted less than x days ago. + """ + document = self.get_object() + document.restore() + + return drf_response.Response( + {"detail": "Document has been successfully restored."}, + status=status.HTTP_200_OK, + ) + @drf.decorators.action( detail=True, methods=["get", "post"], diff --git a/src/backend/core/models.py b/src/backend/core/models.py index fca9cfcc..4aa4de87 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -662,6 +662,7 @@ class Document(MP_Node, BaseModel): "invite_owner": is_owner, "move": is_owner_or_admin and not self.ancestors_deleted_at, "partial_update": can_update, + "restore": is_owner, "retrieve": can_get, "media_auth": can_get, "update": can_update, @@ -753,6 +754,52 @@ class Document(MP_Node, BaseModel): ancestors_deleted_at=self.ancestors_deleted_at ) + @transaction.atomic + def restore(self): + """Cancelling a soft delete with checks.""" + # This should not happen + if self.deleted_at is None: + raise ValidationError({"deleted_at": [_("This document is not deleted.")]}) + + if self.deleted_at < get_trashbin_cutoff(): + raise ValidationError( + { + "deleted_at": [ + _( + "This document was permanently deleted and cannot be restored." + ) + ] + } + ) + + # Restore the current document + self.deleted_at = None + + # Calculate the minimum `deleted_at` among all ancestors + ancestors_deleted_at = ( + self.get_ancestors() + .filter(deleted_at__isnull=False) + .values_list("deleted_at", flat=True) + ) + self.ancestors_deleted_at = min(ancestors_deleted_at, default=None) + self.save() + + # Update descendants excluding those who were deleted prior to the deletion of the + # current document (the ancestor_deleted_at date for those should already by good) + # The number of deleted descendants should not be too big so we can handcraft a union + # clause for them: + deleted_descendants_paths = ( + self.get_descendants() + .filter(deleted_at__isnull=False) + .values_list("path", flat=True) + ) + exclude_condition = models.Q( + *(models.Q(path__startswith=path) for path in deleted_descendants_paths) + ) + self.get_descendants().exclude(exclude_condition).update( + ancestors_deleted_at=self.ancestors_deleted_at + ) + class LinkTrace(BaseModel): """ diff --git a/src/backend/core/tests/documents/test_api_documents_restore.py b/src/backend/core/tests/documents/test_api_documents_restore.py new file mode 100644 index 00000000..5ae64aec --- /dev/null +++ b/src/backend/core/tests/documents/test_api_documents_restore.py @@ -0,0 +1,126 @@ +""" +Test restoring documents after a soft delete via the detail action API endpoint. +""" + +from datetime import timedelta + +from django.utils import timezone + +import pytest +from rest_framework.test import APIClient + +from core import factories + +pytestmark = pytest.mark.django_db + + +def test_api_documents_restore_anonymous_user(): + """Anonymous users should not be able to restore deleted documents.""" + now = timezone.now() - timedelta(days=15) + document = factories.DocumentFactory(deleted_at=now) + + response = APIClient().post(f"/api/v1.0/documents/{document.id!s}/restore/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + document.refresh_from_db() + assert document.deleted_at == now + assert document.ancestors_deleted_at == now + + +@pytest.mark.parametrize("role", [None, "reader", "editor", "administrator"]) +def test_api_documents_restore_authenticated_no_permission(role): + """ + Authenticated users who are not owners of a deleted document should + not be allowed to restore it. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + now = timezone.now() - timedelta(days=15) + document = factories.DocumentFactory( + deleted_at=now, link_reach="public", link_role="editor" + ) + if role: + factories.UserDocumentAccessFactory(document=document, user=user, role=role) + + response = client.post(f"/api/v1.0/documents/{document.id!s}/restore/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} + + document.refresh_from_db() + assert document.deleted_at == now + assert document.ancestors_deleted_at == now + + +def test_api_documents_restore_authenticated_owner_success(): + """The owner of a deleted document should be able to restore it.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + now = timezone.now() - timedelta(days=15) + document = factories.DocumentFactory(deleted_at=now) + factories.UserDocumentAccessFactory(document=document, user=user, role="owner") + + response = client.post(f"/api/v1.0/documents/{document.id!s}/restore/") + + assert response.status_code == 200 + assert response.json() == {"detail": "Document has been successfully restored."} + + document.refresh_from_db() + assert document.deleted_at is None + assert document.ancestors_deleted_at is None + + +def test_api_documents_restore_authenticated_owner_ancestor_deleted(): + """ + The restored document should still be marked as deleted if one of its + ancestors is soft deleted as well. + """ + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + grand_parent = factories.DocumentFactory() + parent = factories.DocumentFactory(parent=grand_parent) + document = factories.DocumentFactory(parent=parent) + factories.UserDocumentAccessFactory(document=document, user=user, role="owner") + + document.soft_delete() + document_deleted_at = document.deleted_at + assert document_deleted_at is not None + + grand_parent.soft_delete() + grand_parent_deleted_at = grand_parent.deleted_at + assert grand_parent_deleted_at is not None + + response = client.post(f"/api/v1.0/documents/{document.id!s}/restore/") + + assert response.status_code == 200 + assert response.json() == {"detail": "Document has been successfully restored."} + + document.refresh_from_db() + assert document.deleted_at is None + # document is still marked as deleted + assert document.ancestors_deleted_at == grand_parent_deleted_at + assert grand_parent_deleted_at > document_deleted_at + + +def test_api_documents_restore_authenticated_owner_expired(): + """It should not be possible to restore a document beyond the allowed time limit.""" + user = factories.UserFactory() + client = APIClient() + client.force_login(user) + + now = timezone.now() - timedelta(days=40) + document = factories.DocumentFactory(deleted_at=now) + factories.UserDocumentAccessFactory(document=document, user=user, role="owner") + + response = client.post(f"/api/v1.0/documents/{document.id!s}/restore/") + + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 99682f65..215164df 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -42,6 +42,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "media_auth": True, "move": False, "partial_update": document.link_role == "editor", + "restore": False, "retrieve": True, "update": document.link_role == "editor", "versions_destroy": False, @@ -97,6 +98,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "media_auth": True, "move": False, "partial_update": grand_parent.link_role == "editor", + "restore": False, "retrieve": True, "update": grand_parent.link_role == "editor", "versions_destroy": False, @@ -185,6 +187,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "media_auth": True, "move": False, "partial_update": document.link_role == "editor", + "restore": False, "retrieve": True, "update": document.link_role == "editor", "versions_destroy": False, @@ -247,6 +250,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "move": False, "media_auth": True, "partial_update": grand_parent.link_role == "editor", + "restore": False, "retrieve": True, "update": grand_parent.link_role == "editor", "versions_destroy": False, @@ -418,6 +422,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "media_auth": True, "move": access.role in ["administrator", "owner"], "partial_update": access.role != "reader", + "restore": access.role == "owner", "retrieve": True, "update": access.role != "reader", "versions_destroy": access.role in ["administrator", "owner"], diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index a28194f3..028740cb 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -160,6 +160,7 @@ def test_models_documents_get_abilities_forbidden( "move": False, "link_configuration": False, "partial_update": False, + "restore": False, "retrieve": False, "update": False, "versions_destroy": False, @@ -207,6 +208,7 @@ def test_models_documents_get_abilities_reader( "media_auth": True, "move": False, "partial_update": False, + "restore": False, "retrieve": True, "update": False, "versions_destroy": False, @@ -254,6 +256,7 @@ def test_models_documents_get_abilities_editor( "media_auth": True, "move": False, "partial_update": True, + "restore": False, "retrieve": True, "update": True, "versions_destroy": False, @@ -288,6 +291,7 @@ def test_models_documents_get_abilities_owner(django_assert_num_queries): "media_auth": True, "move": True, "partial_update": True, + "restore": True, "retrieve": True, "update": True, "versions_destroy": True, @@ -322,6 +326,7 @@ def test_models_documents_get_abilities_administrator(django_assert_num_queries) "media_auth": True, "move": True, "partial_update": True, + "restore": False, "retrieve": True, "update": True, "versions_destroy": True, @@ -355,6 +360,7 @@ def test_models_documents_get_abilities_editor_user(django_assert_num_queries): "media_auth": True, "move": False, "partial_update": True, + "restore": False, "retrieve": True, "update": True, "versions_destroy": False, @@ -391,6 +397,7 @@ def test_models_documents_get_abilities_reader_user(django_assert_num_queries): "media_auth": True, "move": False, "partial_update": access_from_link, + "restore": False, "retrieve": True, "update": access_from_link, "versions_destroy": False, @@ -430,6 +437,7 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries): "media_auth": True, "move": False, "partial_update": False, + "restore": False, "retrieve": True, "update": False, "versions_destroy": False, From 8c247c8777786e10f8456cc861f5329780798df8 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Fri, 17 Jan 2025 17:15:17 +0100 Subject: [PATCH 17/22] =?UTF-8?q?=F0=9F=94=A7(backend)=20bump=20maximum=20?= =?UTF-8?q?page=20size=20to=20200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new UI with infinite scroll calls for longer pages which we are able to produce thanks to the many optimizations on the list view. --- CHANGELOG.md | 4 ++++ src/backend/core/api/viewsets.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e6bd3fd..6e7f3713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,10 @@ and this project adheres to - 💄(frontend) add abilities on doc row #581 - 💄(frontend) improve DocsGridItem responsive padding #582 +## Changed + +- 🔧(backend) Bump page size to 200 #516 + ## Removed - 🔥(backend) remove "content" field from list serializer # 516 diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 93f8be0f..18ff2163 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -133,7 +133,7 @@ class Pagination(drf.pagination.PageNumberPagination): """Pagination to display no more than 100 objects per page sorted by creation date.""" ordering = "-created_on" - max_page_size = 100 + max_page_size = 200 page_size_query_param = "page_size" From 5042f4ca47d441a7212a818462f7cb8eb60e5c52 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Fri, 17 Jan 2025 19:50:03 +0100 Subject: [PATCH 18/22] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20generalize?= =?UTF-8?q?=20use=20of=20SerializerPerActionMixin=20in=20viewsets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We improve the serializer and generalize its use for clarity. --- src/backend/core/api/viewsets.py | 33 +++++++++---------- .../documents/test_api_document_accesses.py | 14 ++++---- .../test_api_document_accesses_create.py | 2 +- .../test_api_document_invitations.py | 8 ++--- .../documents/test_api_document_versions.py | 12 +++---- .../templates/test_api_template_accesses.py | 14 ++++---- .../test_api_template_accesses_create.py | 2 +- 7 files changed, 42 insertions(+), 43 deletions(-) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 18ff2163..d41a62f9 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -117,16 +117,23 @@ class SerializerPerActionMixin: This mixin is useful to avoid to define a serializer class for each action in the `get_serializer_class` method. - """ - serializer_classes: dict[str, type] = {} - default_serializer_class: type = None + Example: + ``` + class MyViewSet(SerializerPerActionMixin, viewsets.GenericViewSet): + serializer_class = MySerializer + list_serializer_class = MyListSerializer + retrieve_serializer_class = MyRetrieveSerializer + ``` + """ def get_serializer_class(self): """ Return the serializer class to use depending on the action. """ - return self.serializer_classes.get(self.action, self.default_serializer_class) + if serializer_class := getattr(self, f"{self.action}_serializer_class", None): + return serializer_class + return super().get_serializer_class() class Pagination(drf.pagination.PageNumberPagination): @@ -314,6 +321,7 @@ class DocumentMetadata(drf.metadata.SimpleMetadata): # pylint: disable=too-many-public-methods class DocumentViewSet( + SerializerPerActionMixin, drf.mixins.CreateModelMixin, drf.mixins.DestroyModelMixin, drf.mixins.ListModelMixin, @@ -424,16 +432,10 @@ class DocumentViewSet( ] queryset = models.Document.objects.all() serializer_class = serializers.DocumentSerializer - - def get_serializer_class(self): - """ - Use ListDocumentSerializer for list actions; otherwise, use DocumentSerializer. - """ - return ( - serializers.ListDocumentSerializer - if self.action == "list" - else self.serializer_class - ) + list_serializer_class = serializers.ListDocumentSerializer + trashbin_serializer_class = serializers.ListDocumentSerializer + children_serializer_class = serializers.ListDocumentSerializer + ai_translate_serializer_class = serializers.AITranslateSerializer def annotate_is_favorite(self, queryset): """ @@ -613,7 +615,6 @@ class DocumentViewSet( @drf.decorators.action( detail=False, methods=["get"], - serializer_class=serializers.ListDocumentSerializer, ) def trashbin(self, request, *args, **kwargs): """ @@ -734,7 +735,6 @@ class DocumentViewSet( detail=True, methods=["get", "post"], ordering=["path"], - serializer_class=serializers.ListDocumentSerializer, url_path="children", ) def children(self, request, *args, **kwargs): @@ -1091,7 +1091,6 @@ class DocumentViewSet( detail=True, methods=["post"], name="Translate a piece of text with AI", - serializer_class=serializers.AITranslateSerializer, url_path="ai-translate", throttle_classes=[utils.AIDocumentRateThrottle, utils.AIUserRateThrottle], ) diff --git a/src/backend/core/tests/documents/test_api_document_accesses.py b/src/backend/core/tests/documents/test_api_document_accesses.py index 5b1ea283..dca6fa79 100644 --- a/src/backend/core/tests/documents/test_api_document_accesses.py +++ b/src/backend/core/tests/documents/test_api_document_accesses.py @@ -76,14 +76,14 @@ def test_api_document_accesses_list_authenticated_related(via, mock_user_teams): user_access = models.DocumentAccess.objects.create( document=document, user=user, - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] user_access = models.DocumentAccess.objects.create( document=document, team="lasuite", - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) access1 = factories.TeamDocumentAccessFactory(document=document) @@ -227,7 +227,7 @@ def test_api_document_accesses_update_anonymous(): new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } api_client = APIClient() @@ -260,7 +260,7 @@ def test_api_document_accesses_update_authenticated_unrelated(): new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -302,7 +302,7 @@ def test_api_document_accesses_update_authenticated_reader_or_editor( new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -413,7 +413,7 @@ def test_api_document_accesses_update_administrator_from_owner(via, mock_user_te new_values = { "id": uuid4(), "user_id": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -527,7 +527,7 @@ def test_api_document_accesses_update_owner( new_values = { "id": uuid4(), "user_id": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): diff --git a/src/backend/core/tests/documents/test_api_document_accesses_create.py b/src/backend/core/tests/documents/test_api_document_accesses_create.py index 8be7865f..3d95bd62 100644 --- a/src/backend/core/tests/documents/test_api_document_accesses_create.py +++ b/src/backend/core/tests/documents/test_api_document_accesses_create.py @@ -26,7 +26,7 @@ def test_api_document_accesses_create_anonymous(): { "user_id": str(other_user.id), "document": str(document.id), - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), }, format="json", ) diff --git a/src/backend/core/tests/documents/test_api_document_invitations.py b/src/backend/core/tests/documents/test_api_document_invitations.py index b30d0a48..5a5e40f7 100644 --- a/src/backend/core/tests/documents/test_api_document_invitations.py +++ b/src/backend/core/tests/documents/test_api_document_invitations.py @@ -304,7 +304,7 @@ def test_api_document_invitations_create_anonymous(): document = factories.DocumentFactory() invitation_values = { "email": "guest@example.com", - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } response = APIClient().post( @@ -325,7 +325,7 @@ def test_api_document_invitations_create_authenticated_outsider(): document = factories.DocumentFactory() invitation_values = { "email": "guest@example.com", - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } client = APIClient() @@ -550,7 +550,7 @@ def test_api_document_invitations_create_issuer_and_document_override(): "document": str(other_document.id), "issuer": str(factories.UserFactory().id), "email": "guest@example.com", - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } client = APIClient() @@ -611,7 +611,7 @@ def test_api_document_invitations_create_cannot_invite_existing_users(): # Build an invitation to the email of an exising identity in the db invitation_values = { "email": existing_user.email, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } client = APIClient() diff --git a/src/backend/core/tests/documents/test_api_document_versions.py b/src/backend/core/tests/documents/test_api_document_versions.py index 4546d18c..83b8c7f5 100644 --- a/src/backend/core/tests/documents/test_api_document_versions.py +++ b/src/backend/core/tests/documents/test_api_document_versions.py @@ -75,14 +75,14 @@ def test_api_document_versions_list_authenticated_related_success(via, mock_user models.DocumentAccess.objects.create( document=document, user=user, - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] models.DocumentAccess.objects.create( document=document, team="lasuite", - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) # Other versions of documents to which the user has access should not be listed @@ -134,14 +134,14 @@ def test_api_document_versions_list_authenticated_related_pagination( models.DocumentAccess.objects.create( document=document, user=user, - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] models.DocumentAccess.objects.create( document=document, team="lasuite", - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) for i in range(4): @@ -210,14 +210,14 @@ def test_api_document_versions_list_authenticated_related_pagination_parent( models.DocumentAccess.objects.create( document=grand_parent, user=user, - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] models.DocumentAccess.objects.create( document=grand_parent, team="lasuite", - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) for i in range(4): diff --git a/src/backend/core/tests/templates/test_api_template_accesses.py b/src/backend/core/tests/templates/test_api_template_accesses.py index cd08abfb..86e5f2bd 100644 --- a/src/backend/core/tests/templates/test_api_template_accesses.py +++ b/src/backend/core/tests/templates/test_api_template_accesses.py @@ -73,14 +73,14 @@ def test_api_template_accesses_list_authenticated_related(via, mock_user_teams): user_access = models.TemplateAccess.objects.create( template=template, user=user, - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) elif via == TEAM: mock_user_teams.return_value = ["lasuite", "unknown"] user_access = models.TemplateAccess.objects.create( template=template, team="lasuite", - role=random.choice(models.RoleChoices.choices)[0], + role=random.choice(models.RoleChoices.values), ) access1 = factories.TeamTemplateAccessFactory(template=template) @@ -219,7 +219,7 @@ def test_api_template_accesses_update_anonymous(): new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } api_client = APIClient() @@ -252,7 +252,7 @@ def test_api_template_accesses_update_authenticated_unrelated(): new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -294,7 +294,7 @@ def test_api_template_accesses_update_authenticated_editor_or_reader( new_values = { "id": uuid4(), "user": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -398,7 +398,7 @@ def test_api_template_accesses_update_administrator_from_owner(via, mock_user_te new_values = { "id": uuid4(), "user_id": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): @@ -497,7 +497,7 @@ def test_api_template_accesses_update_owner(via, mock_user_teams): new_values = { "id": uuid4(), "user_id": factories.UserFactory().id, - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), } for field, value in new_values.items(): diff --git a/src/backend/core/tests/templates/test_api_template_accesses_create.py b/src/backend/core/tests/templates/test_api_template_accesses_create.py index 9a5072ed..f52a5344 100644 --- a/src/backend/core/tests/templates/test_api_template_accesses_create.py +++ b/src/backend/core/tests/templates/test_api_template_accesses_create.py @@ -23,7 +23,7 @@ def test_api_template_accesses_create_anonymous(): { "user": str(other_user.id), "template": str(template.id), - "role": random.choice(models.RoleChoices.choices)[0], + "role": random.choice(models.RoleChoices.values), }, format="json", ) From 5c5763a0efaabd75546588c848c653e9e2655101 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Mon, 27 Jan 2025 21:20:16 +0100 Subject: [PATCH 19/22] =?UTF-8?q?=F0=9F=97=83=EF=B8=8F(backend)=20make=20d?= =?UTF-8?q?ocument/template=20creation=20atomic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When creating a new document/template via the API, we add the logged-in user as owner of the created object. This should be done atomically with the object creation to make sure we don't end-up with an orphan object that the creator can't access anymore. --- src/backend/core/api/viewsets.py | 11 ++--------- .../tests/documents/test_api_documents_trashbin.py | 1 + 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index d41a62f9..e9616aff 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -14,15 +14,6 @@ from django.core.exceptions import ValidationError from django.core.files.storage import default_storage from django.db import models as db from django.db import transaction -from django.db.models import ( - Exists, - F, - Func, - OuterRef, - Q, - Subquery, - Value, -) from django.db.models.expressions import RawSQL from django.db.models.functions import Left, Length from django.http import Http404 @@ -579,6 +570,7 @@ class DocumentViewSet( return drf.response.Response(serializer.data) + @transaction.atomic def perform_create(self, serializer): """Set the current user as creator and owner of the newly created object.""" obj = models.Document.add_root( @@ -1250,6 +1242,7 @@ class TemplateViewSet( serializer = self.get_serializer(queryset, many=True) return drf.response.Response(serializer.data) + @transaction.atomic def perform_create(self, serializer): """Set the current user as owner of the newly created object.""" obj = serializer.save() diff --git a/src/backend/core/tests/documents/test_api_documents_trashbin.py b/src/backend/core/tests/documents/test_api_documents_trashbin.py index a05c6221..b1a8b3b5 100644 --- a/src/backend/core/tests/documents/test_api_documents_trashbin.py +++ b/src/backend/core/tests/documents/test_api_documents_trashbin.py @@ -85,6 +85,7 @@ def test_api_documents_trashbin_format(): "media_auth": True, "move": False, # Can't move a deleted document "partial_update": True, + "restore": True, "retrieve": True, "update": True, "versions_destroy": True, From addc6a331f619e574fbdfeab777c49450564aae0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:25:13 +0000 Subject: [PATCH 20/22] =?UTF-8?q?=E2=AC=86=EF=B8=8F(dependencies)=20update?= =?UTF-8?q?=20js=20dependencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/apps/e2e/package.json | 2 +- src/frontend/apps/impress/package.json | 44 +- src/frontend/package.json | 14 +- .../eslint-config-impress/package.json | 16 +- src/frontend/servers/y-provider/package.json | 14 +- src/frontend/yarn.lock | 2626 ++++++++++++----- 6 files changed, 1891 insertions(+), 825 deletions(-) diff --git a/src/frontend/apps/e2e/package.json b/src/frontend/apps/e2e/package.json index aa041400..2344867e 100644 --- a/src/frontend/apps/e2e/package.json +++ b/src/frontend/apps/e2e/package.json @@ -12,7 +12,7 @@ "test:ui::chromium": "yarn test:ui --project=chromium" }, "devDependencies": { - "@playwright/test": "1.49.1", + "@playwright/test": "1.50.0", "@types/node": "*", "@types/pdf-parse": "1.1.4", "eslint-config-impress": "*", diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index a4735a57..77b4c115 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -21,45 +21,45 @@ "@blocknote/xl-docx-exporter": "0.21.0", "@blocknote/xl-pdf-exporter": "0.21.0", "@gouvfr-lasuite/integration": "1.0.2", - "@hocuspocus/provider": "2.15.0", - "@openfun/cunningham-react": "2.9.4", + "@hocuspocus/provider": "2.15.1", + "@openfun/cunningham-react": "3.0.0", "@react-pdf/renderer": "4.1.6", - "@sentry/nextjs": "8.47.0", - "@tanstack/react-query": "5.62.11", + "@sentry/nextjs": "8.52.0", + "@tanstack/react-query": "5.65.1", "cmdk": "1.0.4", "crisp-sdk-web": "1.0.25", - "docx": "9.1.0", - "i18next": "24.2.0", + "docx": "9.1.1", + "i18next": "24.2.2", "i18next-browser-languagedetector": "8.0.2", "idb": "8.0.1", "lodash": "4.17.21", "luxon": "3.5.0", - "next": "15.1.3", - "posthog-js": "1.204.0", + "next": "15.1.6", + "posthog-js": "1.211.3", "react": "*", - "react-aria-components": "1.5.0", + "react-aria-components": "1.6.0", "react-dom": "*", "react-i18next": "15.4.0", - "react-intersection-observer": "9.13.1", - "react-select": "5.9.0", - "styled-components": "6.1.13", + "react-intersection-observer": "9.15.1", + "react-select": "5.10.0", + "styled-components": "6.1.14", "use-debounce": "10.0.4", "y-protocols": "1.0.6", - "yjs": "13.6.21", - "zustand": "5.0.2" + "yjs": "13.6.23", + "zustand": "5.0.3" }, "devDependencies": { "@svgr/webpack": "8.1.0", - "@tanstack/react-query-devtools": "5.62.11", + "@tanstack/react-query-devtools": "5.65.1", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "16.1.0", - "@testing-library/user-event": "14.5.2", + "@testing-library/react": "16.2.0", + "@testing-library/user-event": "14.6.1", "@types/jest": "29.5.14", - "@types/lodash": "4.17.13", + "@types/lodash": "4.17.15", "@types/luxon": "3.4.2", "@types/node": "*", - "@types/react": "18.3.12", + "@types/react": "19.0.8", "@types/react-dom": "*", "cross-env": "7.0.3", "dotenv": "16.4.7", @@ -69,9 +69,9 @@ "jest-environment-jsdom": "29.7.0", "node-fetch": "2.7.0", "prettier": "3.4.2", - "stylelint": "16.12.0", - "stylelint-config-standard": "36.0.1", - "stylelint-prettier": "5.0.2", + "stylelint": "16.14.1", + "stylelint-config-standard": "37.0.0", + "stylelint-prettier": "5.0.3", "typescript": "*", "webpack": "5.97.1", "workbox-webpack-plugin": "7.1.0" diff --git a/src/frontend/package.json b/src/frontend/package.json index 2e35ddf8..76369810 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -28,13 +28,13 @@ "server:test": "yarn COLLABORATION_SERVER run test" }, "resolutions": { - "@types/node": "22.10.3", - "@types/react-dom": "18.3.1", - "@typescript-eslint/eslint-plugin": "8.19.0", - "@typescript-eslint/parser": "8.19.0", + "@types/node": "22.12.0", + "@types/react-dom": "19.0.3", + "@typescript-eslint/eslint-plugin": "8.22.0", + "@typescript-eslint/parser": "8.22.0", "eslint": "8.57.0", - "react": "18.3.1", - "react-dom": "18.3.1", - "typescript": "5.7.2" + "react": "19.0.0", + "react-dom": "19.0.0", + "typescript": "5.7.3" } } diff --git a/src/frontend/packages/eslint-config-impress/package.json b/src/frontend/packages/eslint-config-impress/package.json index 3c581289..81a83913 100644 --- a/src/frontend/packages/eslint-config-impress/package.json +++ b/src/frontend/packages/eslint-config-impress/package.json @@ -6,19 +6,19 @@ "lint": "eslint --ext .js ." }, "dependencies": { - "@next/eslint-plugin-next": "15.1.3", - "@tanstack/eslint-plugin-query": "5.62.9", + "@next/eslint-plugin-next": "15.1.6", + "@tanstack/eslint-plugin-query": "5.65.0", "@typescript-eslint/eslint-plugin": "*", "@typescript-eslint/parser": "*", "eslint": "*", - "eslint-config-next": "15.1.3", - "eslint-config-prettier": "9.1.0", + "eslint-config-next": "15.1.6", + "eslint-config-prettier": "10.0.1", "eslint-plugin-import": "2.31.0", - "eslint-plugin-jest": "28.10.0", + "eslint-plugin-jest": "28.11.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-playwright": "2.1.0", - "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.37.3", + "eslint-plugin-playwright": "2.2.0", + "eslint-plugin-prettier": "5.2.3", + "eslint-plugin-react": "7.37.4", "eslint-plugin-testing-library": "7.1.1", "prettier": "3.4.2" } diff --git a/src/frontend/servers/y-provider/package.json b/src/frontend/servers/y-provider/package.json index e31bddaf..7ce61ab4 100644 --- a/src/frontend/servers/y-provider/package.json +++ b/src/frontend/servers/y-provider/package.json @@ -16,25 +16,25 @@ "node": ">=18" }, "dependencies": { - "@blocknote/server-util": "0.22.0", - "@hocuspocus/server": "2.15.0", - "@sentry/node": "8.47.0", - "@sentry/profiling-node": "8.47.0", + "@blocknote/server-util": "0.21.0", + "@hocuspocus/server": "2.15.1", + "@sentry/node": "8.52.0", + "@sentry/profiling-node": "8.52.0", "cors": "2.8.5", "express": "4.21.2", "express-ws": "5.0.2", "y-protocols": "1.0.6", - "yjs": "13.6.21" + "yjs": "13.6.23" }, "devDependencies": { - "@hocuspocus/provider": "2.15.0", + "@hocuspocus/provider": "2.15.1", "@types/cors": "2.8.17", "@types/express": "5.0.0", "@types/express-ws": "3.0.5", "@types/jest": "29.5.14", "@types/node": "*", "@types/supertest": "6.0.2", - "@types/ws": "8.5.13", + "@types/ws": "8.5.14", "cross-env": "7.0.3", "eslint-config-impress": "*", "jest": "29.7.0", diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index e230c8c2..db051d71 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -1037,55 +1037,6 @@ y-protocols "^1.0.6" yjs "^13.6.15" -"@blocknote/core@^0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@blocknote/core/-/core-0.22.0.tgz#2f363f9677d4fa5f20299b22850f5f34a6340a55" - integrity sha512-AAEx01zK6u+b1SsZniMm/aogEMjasF4vA9ZHgFGj04G7AwK5Hjwa0Sxre58qcW+KzuvR09CQHTkwjmgVmJX/HA== - dependencies: - "@emoji-mart/data" "^1.2.1" - "@tiptap/core" "^2.7.1" - "@tiptap/extension-bold" "^2.7.1" - "@tiptap/extension-code" "^2.7.1" - "@tiptap/extension-collaboration" "^2.7.1" - "@tiptap/extension-collaboration-cursor" "^2.7.1" - "@tiptap/extension-gapcursor" "^2.7.1" - "@tiptap/extension-hard-break" "^2.7.1" - "@tiptap/extension-history" "^2.7.1" - "@tiptap/extension-horizontal-rule" "^2.7.1" - "@tiptap/extension-italic" "^2.7.1" - "@tiptap/extension-link" "^2.7.1" - "@tiptap/extension-paragraph" "^2.7.1" - "@tiptap/extension-strike" "^2.7.1" - "@tiptap/extension-table-cell" "^2.7.1" - "@tiptap/extension-table-header" "^2.7.1" - "@tiptap/extension-table-row" "^2.7.1" - "@tiptap/extension-text" "^2.7.1" - "@tiptap/extension-underline" "^2.7.1" - "@tiptap/pm" "^2.7.1" - emoji-mart "^5.6.0" - hast-util-from-dom "^4.2.0" - prosemirror-dropcursor "^1.8.1" - prosemirror-highlight "^0.9.0" - prosemirror-model "^1.23.0" - prosemirror-state "^1.4.3" - prosemirror-tables "^1.6.1" - prosemirror-transform "^1.10.2" - prosemirror-view "^1.33.7" - rehype-format "^5.0.0" - rehype-parse "^8.0.4" - rehype-remark "^9.1.2" - rehype-stringify "^9.0.3" - remark-gfm "^3.0.1" - remark-parse "^10.0.1" - remark-rehype "^10.1.0" - remark-stringify "^10.0.2" - shiki "^1.22.0" - unified "^10.1.2" - uuid "^8.3.2" - y-prosemirror "1.2.13" - y-protocols "^1.0.6" - yjs "^13.6.15" - "@blocknote/mantine@0.21.0": version "0.21.0" resolved "https://registry.yarnpkg.com/@blocknote/mantine/-/mantine-0.21.0.tgz#b8a640f498a4884129fe33f854be8d2bb842ea41" @@ -1110,25 +1061,13 @@ lodash.merge "^4.6.2" react-icons "^5.2.1" -"@blocknote/react@^0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@blocknote/react/-/react-0.22.0.tgz#a17167a26b70ef421218ae3e49d15cca751291f0" - integrity sha512-Y6Oj99iOKnlh2FE/lgy8kO5PziPnA8MyEJyjCH9Jbvlc9t493L9EFmLK8iKBZek7sh0TOzhXGBOA6lIpk02X6A== +"@blocknote/server-util@0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@blocknote/server-util/-/server-util-0.21.0.tgz#4649118c2b0b100b01cb89f5c98503b4ab630394" + integrity sha512-WNbnOHOwzISmXvczE6sKzE39Tk2P+9QFjzMKtXY71xBXVyEpSQukKuSVGF8Io9903aNH5kwNgBdGN36CuumNtA== dependencies: - "@blocknote/core" "^0.22.0" - "@floating-ui/react" "^0.26.4" - "@tiptap/core" "^2.7.1" - "@tiptap/react" "^2.7.1" - lodash.merge "^4.6.2" - react-icons "^5.2.1" - -"@blocknote/server-util@0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@blocknote/server-util/-/server-util-0.22.0.tgz#0b4b2990e3e4fe5fffaef3b1870ef47c61d173db" - integrity sha512-d75ZSCrbwk1XdYglqUb+mKLkezIDT7J5Se9WCopc0DeKPXxoP7SbSEAjxfiAfgNGrB3Gj6um/PvbGKyF3gqB+A== - dependencies: - "@blocknote/core" "^0.22.0" - "@blocknote/react" "^0.22.0" + "@blocknote/core" "^0.21.0" + "@blocknote/react" "^0.21.0" "@tiptap/core" "^2.7.1" "@tiptap/pm" "^2.7.1" jsdom "^25.0.1" @@ -1499,15 +1438,15 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== -"@fontsource-variable/roboto-flex@5.0.16": - version "5.0.16" - resolved "https://registry.yarnpkg.com/@fontsource-variable/roboto-flex/-/roboto-flex-5.0.16.tgz#277bcd53e7548d21db2b091eb58fd9c4c9792853" - integrity sha512-aMJw0ac9M2fu78YUx5BRtdSqNqGV4cJPF6lbFpow8e0hXVH7wPwk5d0mpox1MTwvHFHRStmkYVB/SSUytmlaSw== +"@fontsource-variable/roboto-flex@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@fontsource-variable/roboto-flex/-/roboto-flex-5.1.1.tgz#6cb42a852ff44bd1574491c33d79aa3c872fff3e" + integrity sha512-cMtqtR+EhqTcox5+Sz+/+N7C8hHheQm1EtxJ9qrr356N2lwbpEU0y5OA4as+V7cdiaEFxXw6jzO9KoqLMZ6tNg== -"@fontsource/material-icons-outlined@5.0.13": - version "5.0.13" - resolved "https://registry.yarnpkg.com/@fontsource/material-icons-outlined/-/material-icons-outlined-5.0.13.tgz#f8f2a669cb5bdc45fb3ca41f057bc149e3484695" - integrity sha512-mQxKJcFiwclTJd0G5fUg0gJ/ZszdaZRSIMFkvbPvMUteA9aSFzFswHr9Yuacw+x4wlBl7GlsVCujAPaBeLv/dw== +"@fontsource/material-icons-outlined@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@fontsource/material-icons-outlined/-/material-icons-outlined-5.1.1.tgz#3a659277f5029fb1ea5f64739d7ef48fd2112a8e" + integrity sha512-HjWe3anHu9RptoAvm2UF6MPXkwsbFbH+vkg48GRIhXPsXyfmZteGHVFZpPxaZnakrmnLXDxUnnKSj7zzqk+Rhg== "@formatjs/ecma402-abstract@2.3.1": version "2.3.1" @@ -1562,29 +1501,29 @@ dependencies: is-negated-glob "^1.0.0" -"@hocuspocus/common@^2.15.0": - version "2.15.0" - resolved "https://registry.yarnpkg.com/@hocuspocus/common/-/common-2.15.0.tgz#6b48c02da9eb36ea8d961055fc843bae817acca8" - integrity sha512-xmapO5PnQvf3lYFWrrOaYPjmdrEIVYOpyjInuiCkCzkUmMQCZDVM3wXjPdMJbgAtQXEPUDVkwpr6dJTLjZgTTQ== +"@hocuspocus/common@^2.15.1": + version "2.15.1" + resolved "https://registry.yarnpkg.com/@hocuspocus/common/-/common-2.15.1.tgz#b4dff6ea5225da17a4ed2767bc37d68d3834b1d7" + integrity sha512-XJ3gGaSB9PywXTZT3d1yI4yByJLQXNXwYAEvgBMKpaaeyokAR3y1Egjfo29XRau4cFJo1CIzr84YepvqyYQZrA== dependencies: lib0 "^0.2.87" -"@hocuspocus/provider@2.15.0": - version "2.15.0" - resolved "https://registry.yarnpkg.com/@hocuspocus/provider/-/provider-2.15.0.tgz#686b8d11f5d0c453803da34403b18bf3eab7310f" - integrity sha512-Zd1YYVIg1PYfxqMbwWlb89+R/pOGg+UQZWBr7u3g2RDOttdM8F9zzyUzm9XcI7CAGZAUvuqB/oiSsMyGxDsuNg== +"@hocuspocus/provider@2.15.1": + version "2.15.1" + resolved "https://registry.yarnpkg.com/@hocuspocus/provider/-/provider-2.15.1.tgz#48cceafef30e3290bcf1a0eaa15e00e165437ff3" + integrity sha512-XIWdu6WYasmfMxmlw2XqZrKvSYJ7qY4Tv+eFL+3PKt3Zqkfw7X0P8GkmApVOOa/1ZzfCTCILV4n4G0cppCJLcw== dependencies: - "@hocuspocus/common" "^2.15.0" + "@hocuspocus/common" "^2.15.1" "@lifeomic/attempt" "^3.0.2" lib0 "^0.2.87" ws "^8.17.1" -"@hocuspocus/server@2.15.0": - version "2.15.0" - resolved "https://registry.yarnpkg.com/@hocuspocus/server/-/server-2.15.0.tgz#8394b2756987c1efefd1f72effa70bac2001e9f1" - integrity sha512-JfhDOz11EOWLs3uExC5ymX2GZwsHodDpCNIwaaTBImffyQEzUqkkBGOHsnMsT9s6ST0ijnVCxCQ4nXp/qTxDZw== +"@hocuspocus/server@2.15.1": + version "2.15.1" + resolved "https://registry.yarnpkg.com/@hocuspocus/server/-/server-2.15.1.tgz#05a31292d9f0dff19741e2a083850e0305a8a164" + integrity sha512-lDsb59oj4BM4bEHUQyXAujR7mDMZ/+h9KSPc4qNWWuyLVdFNE4+zMRFfD6P/3LB16M8POXIKPIGQ3zysNQsZSQ== dependencies: - "@hocuspocus/common" "^2.15.0" + "@hocuspocus/common" "^2.15.1" async-lock "^1.3.1" kleur "^4.1.4" lib0 "^0.2.47" @@ -1723,21 +1662,21 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== -"@internationalized/date@3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.5.tgz#7d34cb9da35127f98dd669fc926bb37e771e177f" - integrity sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ== - dependencies: - "@swc/helpers" "^0.5.0" - -"@internationalized/date@^3.5.5", "@internationalized/date@^3.6.0": +"@internationalized/date@3.6.0", "@internationalized/date@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.6.0.tgz#b30d43030bfed1855f20c9503606926d75bfdf64" integrity sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/message@^3.1.4", "@internationalized/message@^3.1.6": +"@internationalized/date@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.7.0.tgz#23a4956308ee108e308517a7137c69ab8f5f2ad9" + integrity sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/message@^3.1.6": version "3.1.6" resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.6.tgz#e5a832788a17214bfb3e5bbf5f0e23ed2f568ad7" integrity sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ== @@ -1745,14 +1684,14 @@ "@swc/helpers" "^0.5.0" intl-messageformat "^10.1.0" -"@internationalized/number@^3.5.3", "@internationalized/number@^3.6.0": +"@internationalized/number@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.6.0.tgz#dc6ba20c41b25eb605f1d5cac7d8668e9022c224" integrity sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/string@^3.2.3", "@internationalized/string@^3.2.5": +"@internationalized/string@^3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.5.tgz#2f387b256e79596a2e62ddd5e15c619fe241189c" integrity sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw== @@ -2015,6 +1954,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@keyv/serialize@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.0.2.tgz#72507c4be94d8914434a4aa80661f8ac6131967f" + integrity sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ== + dependencies: + buffer "^6.0.3" + "@lifeomic/attempt@^3.0.2": version "3.1.0" resolved "https://registry.yarnpkg.com/@lifeomic/attempt/-/attempt-3.1.0.tgz#7fc703559177b81a008b9d263e3d9a001d11d08a" @@ -2042,57 +1988,57 @@ resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.22.tgz#7eace697084e2bc5a831eb0fd7cbbc04cc1b0354" integrity sha512-RSKlNZvxhMCkOFZ6slbYvZYbWjHUM+PxDQnupIOxIdsTZQQjx/BFfrfJ7kQFOP+g7MtpOds8weAetEs5obwMOQ== -"@next/env@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.3.tgz#bc747e041cd105170d4cae07cc802e20b4a0c153" - integrity sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw== +"@next/env@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.6.tgz#2fa863d8c568a56b1c8328a86e621b8bdd4f2a20" + integrity sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w== -"@next/eslint-plugin-next@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.3.tgz#32777736af151577df52d83f25c0c22bc9f3cb5e" - integrity sha512-oeP1vnc5Cq9UoOb8SYHAEPbCXMzOgG70l+Zfd+Ie00R25FOm+CCVNrcIubJvB1tvBgakXE37MmqSycksXVPRqg== +"@next/eslint-plugin-next@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.6.tgz#1d6d0fd21f58a650821bafeb3a205b25276ce5e3" + integrity sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw== dependencies: fast-glob "3.3.1" -"@next/swc-darwin-arm64@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz#cac0dc4a1086a33767cc5fb8d11c97391216ca7c" - integrity sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg== +"@next/swc-darwin-arm64@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz#92f99badab6cb41f4c5c11a3feffa574bd6a9276" + integrity sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw== -"@next/swc-darwin-x64@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz#7ebfe9abd7db5abbd28e699d234517f63259ff53" - integrity sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA== +"@next/swc-darwin-x64@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz#f56f4f8d5f6cb5d3915912ac95590d387f897da5" + integrity sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg== -"@next/swc-linux-arm64-gnu@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz#a6773ea8df2838e8aea1d638176f40849af1ed06" - integrity sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw== +"@next/swc-linux-arm64-gnu@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz#0aaffae519c93d1006419d7b98c34ebfd80ecacd" + integrity sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg== -"@next/swc-linux-arm64-musl@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz#309f60d4218511d152876e7f6cc624b7e6a44f6c" - integrity sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w== +"@next/swc-linux-arm64-musl@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz#e7398d3d31ca60033f708a718cd6c31edcee2e9a" + integrity sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ== -"@next/swc-linux-x64-gnu@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz#c9ac936eee265da738cde4758d95af4562bbd38b" - integrity sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw== +"@next/swc-linux-x64-gnu@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz#d76c72508f4d79d6016cab0c52640b93e590cffb" + integrity sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ== -"@next/swc-linux-x64-musl@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz#2fe0c262b379f3c5b39cab2fa0ba3d9108c8e440" - integrity sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw== +"@next/swc-linux-x64-musl@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz#0b8ba80a53e65bf8970ed11ea923001e2512c7cb" + integrity sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ== -"@next/swc-win32-arm64-msvc@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz#67252289babfa38712497af646744ffc758aa3dc" - integrity sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw== +"@next/swc-win32-arm64-msvc@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz#81b5dbbfdada2c05deef688e799af4a24097b65f" + integrity sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg== -"@next/swc-win32-x64-msvc@15.1.3": - version "15.1.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz#99f8e4cc2b6c469155e75c4e8fdeb5d08254b27c" - integrity sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ== +"@next/swc-win32-x64-msvc@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz#131993c45ffd124fb4b15258e2f3f9669c143e3c" + integrity sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2120,31 +2066,31 @@ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@openfun/cunningham-react@2.9.4": - version "2.9.4" - resolved "https://registry.yarnpkg.com/@openfun/cunningham-react/-/cunningham-react-2.9.4.tgz#f8dba15033597d8d5cbd96601c3a624e1e273df9" - integrity sha512-jz91L48LoSwL1cH3pfuMRdlGdVEeAkRhR6iseRtNQTcoUi5DIDsZemdtf0ltoxJOYjitZdcOC1U6/J8TV3H+Xg== +"@openfun/cunningham-react@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@openfun/cunningham-react/-/cunningham-react-3.0.0.tgz#0978fa63ca1b56b04bd6525a9f46534731a7c187" + integrity sha512-9LhcqiAkCriJbQouc3wiIJ1Ujd8Q9uvo0mubw21yZTm5d6TLj/XNzzX0mwWaoVSe2szHtcR0vjpRqls2Ue7u4g== dependencies: - "@fontsource-variable/roboto-flex" "5.0.16" - "@fontsource/material-icons-outlined" "5.0.13" - "@internationalized/date" "3.5.5" + "@fontsource-variable/roboto-flex" "5.1.1" + "@fontsource/material-icons-outlined" "5.1.1" + "@internationalized/date" "3.6.0" "@openfun/cunningham-tokens" "*" - "@react-aria/calendar" "3.5.11" - "@react-aria/datepicker" "3.11.2" - "@react-aria/i18n" "3.12.2" - "@react-stately/calendar" "3.5.4" - "@react-stately/datepicker" "3.10.2" - "@tanstack/react-table" "8.20.1" + "@react-aria/calendar" "3.6.0" + "@react-aria/datepicker" "3.12.0" + "@react-aria/i18n" "3.12.4" + "@react-stately/calendar" "3.6.0" + "@react-stately/datepicker" "3.11.0" + "@tanstack/react-table" "8.20.6" "@types/react-modal" "3.16.3" - chromatic "11.7.1" + chromatic "11.22.0" classnames "2.5.1" downshift "9.0.8" - react "18.3.1" - react-aria "3.34.2" - react-aria-components "1.3.2" - react-dom "18.3.1" - react-modal "3.16.1" - react-stately "3.32.2" + react "19.0.0" + react-aria "3.36.0" + react-aria-components "1.5.0" + react-dom "19.0.0" + react-modal "3.16.3" + react-stately "3.34.0" "@openfun/cunningham-tokens@*": version "2.1.1" @@ -2471,12 +2417,12 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@playwright/test@1.49.1": - version "1.49.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.49.1.tgz#55fa360658b3187bfb6371e2f8a64f50ef80c827" - integrity sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g== +"@playwright/test@1.50.0": + version "1.50.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.50.0.tgz#25c63a09f833f89da4d54ad67db7900359e2d11d" + integrity sha512-ZGNXbt+d65EGjBORQHuYKj+XhCewlwpnSd/EDuLPZGSiEWmgOJB5RmMCCYGy5aMfTs9wx61RivfDKi8H/hcMvw== dependencies: - playwright "1.49.1" + playwright "1.50.0" "@popperjs/core@^2.9.0": version "2.11.8" @@ -2613,7 +2559,26 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== -"@react-aria/breadcrumbs@^3.5.16", "@react-aria/breadcrumbs@^3.5.19": +"@react-aria/autocomplete@3.0.0-alpha.37": + version "3.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/@react-aria/autocomplete/-/autocomplete-3.0.0-alpha.37.tgz#f8ba3df6c91dcf3d449b416d72c184812533eff3" + integrity sha512-a7awFG3hshJ/kX7Qti/cJAKOG0XU5F/XW6fQffKGfEge7PmiWIvaLTrT5her79/v8v/bRBykIkpEgDCFE7WGzg== + dependencies: + "@react-aria/combobox" "^3.11.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/listbox" "^3.14.0" + "@react-aria/searchfield" "^3.8.0" + "@react-aria/textfield" "^3.16.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/autocomplete" "3.0.0-alpha.0" + "@react-stately/combobox" "^3.10.2" + "@react-types/autocomplete" "3.0.0-alpha.28" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/breadcrumbs@^3.5.19": version "3.5.19" resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.19.tgz#e0a67e0e7017089fa0ee5eadd51a6da505b94cd4" integrity sha512-mVngOPFYVVhec89rf/CiYQGTfaLRfHFtX+JQwY7sNYNqSA+gO8p4lNARe3Be6bJPgH+LUQuruIY9/ZDL6LT3HA== @@ -2625,7 +2590,19 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/button@^3.11.0", "@react-aria/button@^3.9.8": +"@react-aria/breadcrumbs@^3.5.20": + version "3.5.20" + resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.20.tgz#b4b2d8647b6386d34c721db4a22f1675c63c1a97" + integrity sha512-xqVSSDPpQuUFpJyIXMQv8L7zumk5CeGX7qTzo4XRvqm5T9qnNAX4XpYEMdktnLrQRY/OemCBScbx7SEwr0B3Kg== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/link" "^3.7.8" + "@react-aria/utils" "^3.27.0" + "@react-types/breadcrumbs" "^3.7.10" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/button@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.11.0.tgz#cb7790db23949ec9c1e698fa531ee5471cf2b515" integrity sha512-b37eIV6IW11KmNIAm65F3SEl2/mgj5BrHIysW6smZX3KoKWTGYsYfcQkmtNgY0GOSFfDxMCoolsZ6mxC00nSDA== @@ -2639,23 +2616,21 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.5.11.tgz#da75da0eaf40a48d33a766b67fc342dc21deb21d" - integrity sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q== +"@react-aria/button@^3.11.1": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.11.1.tgz#f285ab52ecb613d2233e3a54c6f3d4f394b6062d" + integrity sha512-NSs2HxHSSPSuYy5bN+PMJzsCNDVsbm1fZ/nrWM2WWWHTBrx9OqyrEXZVV9ebzQCN9q0nzhwpf6D42zHIivWtJA== dependencies: - "@internationalized/date" "^3.5.5" - "@react-aria/i18n" "^3.12.2" - "@react-aria/interactions" "^3.22.2" - "@react-aria/live-announcer" "^3.3.4" - "@react-aria/utils" "^3.25.2" - "@react-stately/calendar" "^3.5.4" - "@react-types/button" "^3.9.6" - "@react-types/calendar" "^3.4.9" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/interactions" "^3.23.0" + "@react-aria/toolbar" "3.0.0-beta.12" + "@react-aria/utils" "^3.27.0" + "@react-stately/toggle" "^3.8.1" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@^3.5.11", "@react-aria/calendar@^3.6.0": +"@react-aria/calendar@3.6.0", "@react-aria/calendar@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.6.0.tgz#d5e7cf4beb8724648a7042dbc5bb519de4351906" integrity sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg== @@ -2671,7 +2646,23 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/checkbox@^3.14.6", "@react-aria/checkbox@^3.15.0": +"@react-aria/calendar@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.7.0.tgz#b0a13dc0acc762157cc774e96dd5dfe8cd624c10" + integrity sha512-9YUbgcox7cQgvZfQtL2BLLRsIuX4mJeclk9HkFoOsAu3RGO5HNsteah8FV54W8BMjm/bNRXIPUxtjTTP+1L6jg== + dependencies: + "@internationalized/date" "^3.7.0" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/utils" "^3.27.0" + "@react-stately/calendar" "^3.7.0" + "@react-types/button" "^3.10.2" + "@react-types/calendar" "^3.6.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/checkbox@^3.15.0": version "3.15.0" resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.15.0.tgz#4d224b71c65d6a079ff935ab22c806323f84b746" integrity sha512-z/8xd4em7o0MroBXwkkwv7QRwiJaA1FwqMhRUb7iqtBGP2oSytBEDf0N7L09oci32a1P4ZPz2rMK5GlLh/PD6g== @@ -2688,16 +2679,22 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/collections@3.0.0-alpha.4": - version "3.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/@react-aria/collections/-/collections-3.0.0-alpha.4.tgz#ad1e8eea9d3c784d17a4de43b3e52d888f45efdd" - integrity sha512-chMNAlsubnpErBWN7sLhmAMOnE7o17hSfq3s0VDHlvRN9K/mPOPlYokmyWkkPqi7fYiR50EPVHDtwTWLJoqfnw== +"@react-aria/checkbox@^3.15.1": + version "3.15.1" + resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.15.1.tgz#384806adc3c2700cb09b2c4e03d8ad25c8ec3892" + integrity sha512-ETgsMDZ0IZzRXy/OVlGkazm8T+PcMHoTvsxp0c+U82c8iqdITA+VJ615eBPOQh6OkkYIIn4cRn/e+69RmGzXng== dependencies: - "@react-aria/ssr" "^3.9.5" - "@react-aria/utils" "^3.25.2" - "@react-types/shared" "^3.24.1" + "@react-aria/form" "^3.0.12" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/toggle" "^3.10.11" + "@react-aria/utils" "^3.27.0" + "@react-stately/checkbox" "^3.6.11" + "@react-stately/form" "^3.1.1" + "@react-stately/toggle" "^3.8.1" + "@react-types/checkbox" "^3.9.1" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" - use-sync-external-store "^1.2.0" "@react-aria/collections@3.0.0-alpha.6": version "3.0.0-alpha.6" @@ -2710,24 +2707,16 @@ "@swc/helpers" "^0.5.0" use-sync-external-store "^1.2.0" -"@react-aria/color@3.0.0-rc.2": - version "3.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.0-rc.2.tgz#b16f363fd61ff11875f3ec49d1f8ad7804919c65" - integrity sha512-h4P7LocDEHPOEWgHYb8VPJLRGkyMhcsXemmvGao6G23zGTpTX8Nr6pEuJhcXQlGWt8hXvj/ASnC750my+zb1yA== +"@react-aria/collections@3.0.0-alpha.7": + version "3.0.0-alpha.7" + resolved "https://registry.yarnpkg.com/@react-aria/collections/-/collections-3.0.0-alpha.7.tgz#932a3aceb2bc942488ad481f42dcd54046059f18" + integrity sha512-JR2Ro33Chlf26NM12zJsK+MOs5/k+PQallT5+4YawndYmbxqlDLADcoFdcORJqh0pKf9OnluWtANobCkQGd0aQ== dependencies: - "@react-aria/i18n" "^3.12.2" - "@react-aria/interactions" "^3.22.2" - "@react-aria/numberfield" "^3.11.6" - "@react-aria/slider" "^3.7.11" - "@react-aria/spinbutton" "^3.6.8" - "@react-aria/textfield" "^3.14.8" - "@react-aria/utils" "^3.25.2" - "@react-aria/visually-hidden" "^3.8.15" - "@react-stately/color" "^3.7.2" - "@react-stately/form" "^3.0.5" - "@react-types/color" "3.0.0-rc.1" - "@react-types/shared" "^3.24.1" + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" + use-sync-external-store "^1.2.0" "@react-aria/color@^3.0.2": version "3.0.2" @@ -2748,7 +2737,26 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/combobox@^3.10.2", "@react-aria/combobox@^3.11.0": +"@react-aria/color@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.3.tgz#28048b8f0d7986bd2f9678e72a135bef15f48a93" + integrity sha512-DDVma2107VHBfSuEnnmy+KJvXvxEXWSAooii2vlHHmQNb5x4rv4YTk+dP5GZl/7MgT8OgPTB9UHoC83bXFMDRA== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/numberfield" "^3.11.10" + "@react-aria/slider" "^3.7.15" + "@react-aria/spinbutton" "^3.6.11" + "@react-aria/textfield" "^3.16.0" + "@react-aria/utils" "^3.27.0" + "@react-aria/visually-hidden" "^3.8.19" + "@react-stately/color" "^3.8.2" + "@react-stately/form" "^3.1.1" + "@react-types/color" "^3.0.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/combobox@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.0.tgz#9489aaad342d092bf1fe1c4c382f6714316ac1c4" integrity sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg== @@ -2769,31 +2777,28 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@3.11.2": - version "3.11.2" - resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.11.2.tgz#628f70ea532480421e7ebe1f0020856baee60639" - integrity sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA== +"@react-aria/combobox@^3.11.1": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.1.tgz#1bb3e390dc4fbe94c5f5c7b1f600f656abd2a8a1" + integrity sha512-TTNbGhUuqxzPcJzd6hufOxuHzX0UARkw+0bl+TuCwNPQnqrcPf20EoOZvd3MHZwGq6GCP4QV+qo0uGx83RpUvA== dependencies: - "@internationalized/date" "^3.5.5" - "@internationalized/number" "^3.5.3" - "@internationalized/string" "^3.2.3" - "@react-aria/focus" "^3.18.2" - "@react-aria/form" "^3.0.8" - "@react-aria/i18n" "^3.12.2" - "@react-aria/interactions" "^3.22.2" - "@react-aria/label" "^3.7.11" - "@react-aria/spinbutton" "^3.6.8" - "@react-aria/utils" "^3.25.2" - "@react-stately/datepicker" "^3.10.2" - "@react-stately/form" "^3.0.5" - "@react-types/button" "^3.9.6" - "@react-types/calendar" "^3.4.9" - "@react-types/datepicker" "^3.8.2" - "@react-types/dialog" "^3.5.12" - "@react-types/shared" "^3.24.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/listbox" "^3.14.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/menu" "^3.17.0" + "@react-aria/overlays" "^3.25.0" + "@react-aria/selection" "^3.22.0" + "@react-aria/textfield" "^3.16.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/collections" "^3.12.1" + "@react-stately/combobox" "^3.10.2" + "@react-stately/form" "^3.1.1" + "@react-types/button" "^3.10.2" + "@react-types/combobox" "^3.13.2" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@^3.11.2", "@react-aria/datepicker@^3.12.0": +"@react-aria/datepicker@3.12.0", "@react-aria/datepicker@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.12.0.tgz#a82ff3ebd3ead20a00096d082c1e6be47bbd5886" integrity sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg== @@ -2817,7 +2822,31 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/dialog@^3.5.17", "@react-aria/dialog@^3.5.20": +"@react-aria/datepicker@^3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.13.0.tgz#ea1f5085da5b8b50c932e94716a7f8bdd0f489f0" + integrity sha512-TmJan65P3Vk7VDBNW5rH9Z25cAn0vk8TEtaP3boCs8wJFE+HbEuB8EqLxBFu47khtuKTEqDP3dTlUh2Vt/f7Xw== + dependencies: + "@internationalized/date" "^3.7.0" + "@internationalized/number" "^3.6.0" + "@internationalized/string" "^3.2.5" + "@react-aria/focus" "^3.19.1" + "@react-aria/form" "^3.0.12" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/spinbutton" "^3.6.11" + "@react-aria/utils" "^3.27.0" + "@react-stately/datepicker" "^3.12.0" + "@react-stately/form" "^3.1.1" + "@react-types/button" "^3.10.2" + "@react-types/calendar" "^3.6.0" + "@react-types/datepicker" "^3.10.0" + "@react-types/dialog" "^3.5.15" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dialog@^3.5.20": version "3.5.20" resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.20.tgz#6404d2c1bab1ea9ecce3ebc7adce64733ecea985" integrity sha512-l0GZVLgeOd3kL3Yj8xQW7wN3gn9WW3RLd/SGI9t7ciTq+I/FhftjXCWzXLlOCCTLMf+gv7eazecECtmoWUaZWQ== @@ -2829,6 +2858,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-aria/dialog@^3.5.21": + version "3.5.21" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.21.tgz#ded634dda5c16b720595f4a1aaa0cfb09b4979ff" + integrity sha512-tBsn9swBhcptJ9QIm0+ur0PVR799N6qmGguva3rUdd+gfitknFScyT08d7AoMr9AbXYdJ+2R9XNSZ3H3uIWQMw== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/overlays" "^3.25.0" + "@react-aria/utils" "^3.27.0" + "@react-types/dialog" "^3.5.15" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-aria/disclosure@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-aria/disclosure/-/disclosure-3.0.0.tgz#36342210740fd659ad97678fe5a57896a7fcbd10" @@ -2840,7 +2881,18 @@ "@react-types/button" "^3.10.1" "@swc/helpers" "^0.5.0" -"@react-aria/dnd@^3.7.2", "@react-aria/dnd@^3.8.0": +"@react-aria/disclosure@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-aria/disclosure/-/disclosure-3.0.1.tgz#a4ddecc8fe031c73c760d9de6fa241b88cf47171" + integrity sha512-rNH8RFcePoAQizcqB7KuHbBOr7sPsysFKCUwbVSOXLPgvCfXKafIhjgFJVqekfsbn5zWvkcTupnzGVJj/F9p+g== + dependencies: + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.27.0" + "@react-stately/disclosure" "^3.0.1" + "@react-types/button" "^3.10.2" + "@swc/helpers" "^0.5.0" + +"@react-aria/dnd@^3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.8.0.tgz#7e3bfa3f509efeb9a872686e65641a719684e95a" integrity sha512-JiqHY3E9fDU5Kb4gN22cuK6QNlpMCGe6ngR/BV+Q8mLEsdoWcoUAYOtYXVNNTRvCdVbEWI87FUU+ThyPpoDhNQ== @@ -2856,7 +2908,23 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/focus@^3.18.2", "@react-aria/focus@^3.19.0": +"@react-aria/dnd@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.8.1.tgz#acb1aae522c6e28b9eb0ae1ff5f009e28962fba4" + integrity sha512-FoXYQ4z33E9YBzIGRJM1B1oZep6CvEWgXvjCZGURatjr3qG7vf95mOqA5kVd9bjLL7QK4w0ujJWEBfog3WmufA== + dependencies: + "@internationalized/string" "^3.2.5" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/overlays" "^3.25.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/dnd" "^3.5.1" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/focus@^3.19.0": version "3.19.0" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.0.tgz#82b9a5b83f023b943a7970df3d059f49d61df05d" integrity sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A== @@ -2867,7 +2935,18 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@^3.0.11", "@react-aria/form@^3.0.8": +"@react-aria/focus@^3.19.1": + version "3.19.1" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.1.tgz#6655e53d04eb7b46c8d39e671013d1c17fca5ba2" + integrity sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg== + dependencies: + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/form@^3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.11.tgz#84511874e1fad5f981bae97ebd4d549923849455" integrity sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw== @@ -2878,6 +2957,17 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-aria/form@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.12.tgz#1d916c15dfa050e4c02a689151a92b4d10bec445" + integrity sha512-8uvPYEd3GDyGt5NRJIzdWW1Ry5HLZq37vzRZKUW8alZ2upFMH3KJJG55L9GP59KiF6zBrYBebvI/YK1Ye1PE1g== + dependencies: + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/form" "^3.1.1" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-aria/grid@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.11.0.tgz#5ad6596745482e109b3b47f1fec7ce372f632707" @@ -2897,7 +2987,26 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/gridlist@^3.10.0", "@react-aria/gridlist@^3.9.2": +"@react-aria/grid@^3.11.1": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.11.1.tgz#51aa217620e811af7df7fef5315df42525bd3b0b" + integrity sha512-Wg8m68RtNWfkhP3Qjrrsl1q1et8QCjXPMRsYgKBahYRS0kq2MDcQ+UBdG1fiCQn/MfNImhTUGVeQX276dy1lww== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/collections" "^3.12.1" + "@react-stately/grid" "^3.10.1" + "@react-stately/selection" "^3.19.0" + "@react-types/checkbox" "^3.9.1" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/gridlist@^3.10.0": version "3.10.0" resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.10.0.tgz#adc2f9896a2759bb29cec428378c8ac85235a110" integrity sha512-UcblfSZ7kJBrjg9mQ5VbnRevN81UiYB4NuL5PwIpBpridO7tnl4ew6+96PYU7Wj1chHhPS3x0b0zmuSVN7A0LA== @@ -2914,21 +3023,24 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@3.12.2": - version "3.12.2" - resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.2.tgz#f1e63ddb5227bc1c8a17cd3475235851e428dd0b" - integrity sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A== +"@react-aria/gridlist@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.10.1.tgz#75d2316633b3636607e448602bf518f7f9a9b59d" + integrity sha512-11FlupBg5C9ehs7R6OjqMPWEOLK/4IuSrq7D1xU+Hnm7ZYI/KKcCXvNMjMmnOz/gGzOmfgVwz5PIKaY9aZarEg== dependencies: - "@internationalized/date" "^3.5.5" - "@internationalized/message" "^3.1.4" - "@internationalized/number" "^3.5.3" - "@internationalized/string" "^3.2.3" - "@react-aria/ssr" "^3.9.5" - "@react-aria/utils" "^3.25.2" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/grid" "^3.11.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/collections" "^3.12.1" + "@react-stately/list" "^3.11.2" + "@react-stately/tree" "^3.8.7" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.12.2", "@react-aria/i18n@^3.12.4": +"@react-aria/i18n@3.12.4", "@react-aria/i18n@^3.12.4": version "3.12.4" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.4.tgz#4520ce48a1b6ebe4aa470d72eba300e65de01814" integrity sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w== @@ -2942,7 +3054,21 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@^3.22.2", "@react-aria/interactions@^3.22.5": +"@react-aria/i18n@^3.12.5": + version "3.12.5" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.5.tgz#7dc2ab8bbf2374c1797e3c553f34735be88f52eb" + integrity sha512-ooeop2pTG94PuaHoN2OTk2hpkqVuoqgEYxRvnc1t7DVAtsskfhS/gVOTqyWGsxvwAvRi7m/CnDu6FYdeQ/bK5w== + dependencies: + "@internationalized/date" "^3.7.0" + "@internationalized/message" "^3.1.6" + "@internationalized/number" "^3.6.0" + "@internationalized/string" "^3.2.5" + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/interactions@^3.22.5": version "3.22.5" resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.5.tgz#9cd8c93b8b6988f1d315d3efb450119d1432bbb8" integrity sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ== @@ -2952,7 +3078,17 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/label@^3.7.11", "@react-aria/label@^3.7.13": +"@react-aria/interactions@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.23.0.tgz#28fce22310faeaa114978728045fb2b4fe80acc8" + integrity sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg== + dependencies: + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/label@^3.7.13": version "3.7.13" resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.13.tgz#9e7153a1ded878b5147d141effc3eb226f3c6c1f" integrity sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg== @@ -2961,7 +3097,16 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/link@^3.7.4", "@react-aria/link@^3.7.7": +"@react-aria/label@^3.7.14": + version "3.7.14" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.14.tgz#a4922cbfbbe20e8e14b84b0c56c504d73257f094" + integrity sha512-EN1Md2YvcC4sMqBoggsGYUEGlTNqUfJZWzduSt29fbQp1rKU2KlybTe+TWxKq/r2fFd+4JsRXxMeJiwB3w2AQA== + dependencies: + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/link@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.7.tgz#5879c75068b63d55353b3e96b4fda0fa8753d1ad" integrity sha512-eVBRcHKhNSsATYWv5wRnZXRqPVcKAWWakyvfrYePIKpC3s4BaHZyTGYdefk8ZwZdEOuQZBqLMnjW80q1uhtkuA== @@ -2973,7 +3118,19 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@^3.13.2", "@react-aria/listbox@^3.13.6": +"@react-aria/link@^3.7.8": + version "3.7.8" + resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.8.tgz#26813464e1adf443ede93ce44d7e2d4a3510d25c" + integrity sha512-oiXUPQLZmf9Q9Xehb/sG1QRxfo28NFKdh9w+unD12sHI6NdLMETl5MA4CYyTgI0dfMtTjtfrF68GCnWfc7JvXQ== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-types/link" "^3.5.10" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/listbox@^3.13.6": version "3.13.6" resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.13.6.tgz#43ff24f4a6540a9952729833201460fa6ab081f7" integrity sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg== @@ -2988,14 +3145,29 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/live-announcer@^3.3.4", "@react-aria/live-announcer@^3.4.1": +"@react-aria/listbox@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.14.0.tgz#5de653504b3600fc3eabc7fa92927ddb5731fee1" + integrity sha512-pyVbKavh8N8iyiwOx6I3JIcICvAzFXkKSFni1yarfgngJsJV3KSyOkzLomOfN9UhbjcV4sX61/fccwJuvlurlA== + dependencies: + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/collections" "^3.12.1" + "@react-stately/list" "^3.11.2" + "@react-types/listbox" "^3.5.4" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/live-announcer@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.4.1.tgz#efedf706b23f6e1b526a3a35c14c202ac3e68487" integrity sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@^3.15.2", "@react-aria/menu@^3.16.0": +"@react-aria/menu@^3.16.0": version "3.16.0" resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.16.0.tgz#119e562806e9f8a39fd468ab790d788905c6df83" integrity sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ== @@ -3015,7 +3187,27 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/meter@^3.4.16", "@react-aria/meter@^3.4.18": +"@react-aria/menu@^3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.17.0.tgz#e4a645366c82420520852dd42649a563ee732939" + integrity sha512-aiFvSv3G1YvPC0klJQ/9quB05xIDZzJ5Lt6/CykP0UwGK5i8GCqm6/cyFLwEXsS5ooUPxS3bqmdOsgdADSSgqg== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/overlays" "^3.25.0" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/collections" "^3.12.1" + "@react-stately/menu" "^3.9.1" + "@react-stately/selection" "^3.19.0" + "@react-stately/tree" "^3.8.7" + "@react-types/button" "^3.10.2" + "@react-types/menu" "^3.9.14" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/meter@^3.4.18": version "3.4.18" resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.18.tgz#ff3f85f32ea30285e7e73386a641efdcedd88205" integrity sha512-tTX3LLlmDIHqrC42dkdf+upb1c4UbhlpZ52gqB64lZD4OD4HE+vMTwNSe+7MRKMLvcdKPWCRC35PnxIHZ15kfQ== @@ -3025,7 +3217,34 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/numberfield@^3.11.6", "@react-aria/numberfield@^3.11.9": +"@react-aria/meter@^3.4.19": + version "3.4.19" + resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.19.tgz#9cdb43c19749ec89d452b31e400dbac64cb2390d" + integrity sha512-IIA+gTHrNVbMuBgcqdGLEKd/ZiKM2hOUqS6uztbT15dwPJTmtfJiTWA2872PiY52p+gqPSanZuTc2TXYJa+rew== + dependencies: + "@react-aria/progress" "^3.4.19" + "@react-types/meter" "^3.4.6" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/numberfield@^3.11.10": + version "3.11.10" + resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.11.10.tgz#ce6b0325c296799ff976a396e733c2ef7c89f784" + integrity sha512-bYbTfO9NbAKMFOfEGGs+lvlxk0I9L0lU3WD2PFQZWdaoBz9TCkL+vK0fJk1zsuKaVjeGsmHP9VesBPRmaP0MiA== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/spinbutton" "^3.6.11" + "@react-aria/textfield" "^3.16.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/form" "^3.1.1" + "@react-stately/numberfield" "^3.9.9" + "@react-types/button" "^3.10.2" + "@react-types/numberfield" "^3.8.8" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/numberfield@^3.11.9": version "3.11.9" resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.11.9.tgz#175f801b18740534dca023cfd9ce0349eff940b0" integrity sha512-3tiGPx2y4zyOV7PmdBASes99ZZsFTZAJTnU45Z+p1CW4131lw7y2ZhbojBl7U6DaXAJvi1z6zY6cq2UE9w5a0Q== @@ -3042,7 +3261,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/overlays@^3.23.2", "@react-aria/overlays@^3.24.0": +"@react-aria/overlays@^3.24.0": version "3.24.0" resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.24.0.tgz#7f97cd12506961abfab3ae653822cea05d1cacd3" integrity sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A== @@ -3059,7 +3278,24 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/progress@^3.4.16", "@react-aria/progress@^3.4.18": +"@react-aria/overlays@^3.25.0": + version "3.25.0" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.25.0.tgz#794c4f2f08ea6ccdd18b3030776b3929a4950cdb" + integrity sha512-UEqJJ4duowrD1JvwXpPZreBuK79pbyNjNxFUVpFSskpGEJe3oCWwsSDKz7P1O7xbx5OYp+rDiY8fk/sE5rkaKw== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.27.0" + "@react-aria/visually-hidden" "^3.8.19" + "@react-stately/overlays" "^3.6.13" + "@react-types/button" "^3.10.2" + "@react-types/overlays" "^3.8.12" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/progress@^3.4.18": version "3.4.18" resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.18.tgz#948859ce1b0e13d935da7d4cbe6812d451472fe4" integrity sha512-FOLgJ9t9i1u3oAAimybJG6r7/soNPBnJfWo4Yr6MmaUv90qVGa1h6kiuM5m9H/bm5JobAebhdfHit9lFlgsCmg== @@ -3071,7 +3307,19 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/radio@^3.10.10", "@react-aria/radio@^3.10.7": +"@react-aria/progress@^3.4.19": + version "3.4.19" + resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.19.tgz#722ea3389da0d067b092b13fe01c3edb2a9c4ce7" + integrity sha512-5HHnBJHqEUuY+dYsjIZDYsENeKr49VCuxeaDZ0OSahbOlloIOB1baCo/6jLBv1O1rwrAzZ2gCCPcVGed/cjrcw== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/label" "^3.7.14" + "@react-aria/utils" "^3.27.0" + "@react-types/progress" "^3.5.9" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/radio@^3.10.10": version "3.10.10" resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.10.tgz#18e2811fb3e72298414c880bd9405ea3f1d83f1f" integrity sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA== @@ -3087,7 +3335,23 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/searchfield@^3.7.11", "@react-aria/searchfield@^3.7.8": +"@react-aria/radio@^3.10.11": + version "3.10.11" + resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.11.tgz#535ca489615e357292835026acb856d561651361" + integrity sha512-R150HsBFPr1jLMShI4aBM8heCa1k6h0KEvnFRfTAOBu+B9hMSZOPB+d6GQOwGPysNlbset90Kej8G15FGHjqiA== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/form" "^3.0.12" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/utils" "^3.27.0" + "@react-stately/radio" "^3.10.10" + "@react-types/radio" "^3.8.6" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/searchfield@^3.7.11": version "3.7.11" resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.7.11.tgz#2be234280cc4fb58a316db6ba1f95ea34754c043" integrity sha512-wFf6QxtBFfoxy0ANxI0+ftFEBGynVCY0+ce4H4Y9LpUTQsIKMp3sdc7LoUFORWw5Yee6Eid5cFPQX0Ymnk+ZJg== @@ -3101,7 +3365,21 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/select@^3.14.8", "@react-aria/select@^3.15.0": +"@react-aria/searchfield@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.8.0.tgz#72b836ed438cb0edff917881a033fd92f945919b" + integrity sha512-AaZuH9YIWlMyE1m7cSjHCfOuQmlWN+w8HVW32TxeGGGL1kJsYAlSYWYHUyYFIKh245kq/m5zUxAxmw5Ygmnx5w== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/textfield" "^3.16.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/searchfield" "^3.5.9" + "@react-types/button" "^3.10.2" + "@react-types/searchfield" "^3.5.11" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/select@^3.15.0": version "3.15.0" resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.15.0.tgz#e0b955ed908039f734805e852b58dec4b159adc9" integrity sha512-zgBOUNy81aJplfc3NKDJMv8HkXjBGzaFF3XDzNfW8vJ7nD9rcTRUN5SQ1XCEnKMv12B/Euk9zt6kd+tX0wk1vQ== @@ -3121,7 +3399,27 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/selection@^3.19.2", "@react-aria/selection@^3.21.0": +"@react-aria/select@^3.15.1": + version "3.15.1" + resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.15.1.tgz#2497a78ad3ea87dc7e46f50e629594e69a5e840d" + integrity sha512-FOtY1tuHt0YTHwOEy/sf7LEIL+Nnkho3wJmfpWQuTxsvMCF7UJdQPYPd6/jGCcCdiqW7H4iqyjUkSp6nk/XRWQ== + dependencies: + "@react-aria/form" "^3.0.12" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/listbox" "^3.14.0" + "@react-aria/menu" "^3.17.0" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-aria/visually-hidden" "^3.8.19" + "@react-stately/select" "^3.6.10" + "@react-types/button" "^3.10.2" + "@react-types/select" "^3.9.9" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/selection@^3.21.0": version "3.21.0" resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.21.0.tgz#c5660e73a38db5e3e1cdc722e408b4489f5f589a" integrity sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg== @@ -3134,7 +3432,20 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/separator@^3.4.2", "@react-aria/separator@^3.4.4": +"@react-aria/selection@^3.22.0": + version "3.22.0" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.22.0.tgz#29dd953cde1e1a3ba44e1d30d097d2babed03e7f" + integrity sha512-XFOrK525HX2eeWeLZcZscUAs5qsuC1ZxsInDXMjvLeAaUPtQNEhUKHj3psDAl6XDU4VV1IJo0qCmFTVqTTMZSg== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/selection" "^3.19.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/separator@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.4.4.tgz#7975177d256d8e864625d9823bf7a6de5a6b6460" integrity sha512-dH+qt0Mdh0nhKXCHW6AR4DF8DKLUBP26QYWaoThPdBwIpypH/JVKowpPtWms1P4b36U6XzHXHnTTEn/ZVoCqNA== @@ -3143,7 +3454,16 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/slider@^3.7.11", "@react-aria/slider@^3.7.14": +"@react-aria/separator@^3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.4.5.tgz#e9303d2ea41e4f09e925df047bb082731c1bf518" + integrity sha512-RQA9sKZdAEjP1Yrv0GpDdXgmXd56kXDE8atPDHEC0/A4lpYh/YFLfXcv1JW0Hlg4kBocdX2pB2INyDGhiD+yfw== + dependencies: + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/slider@^3.7.14": version "3.7.14" resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.14.tgz#25a362725d6cd71e9b86477362a36c847c73384e" integrity sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA== @@ -3158,7 +3478,22 @@ "@react-types/slider" "^3.7.7" "@swc/helpers" "^0.5.0" -"@react-aria/spinbutton@^3.6.10", "@react-aria/spinbutton@^3.6.8": +"@react-aria/slider@^3.7.15": + version "3.7.15" + resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.15.tgz#5cbce3b8f4ac55ff7794124f7bb3cd2edab6ae01" + integrity sha512-v9tujsuvJYRX0vE/vMYBzTT9FXbzrLsjkOrouNq+UdBIr7wRjIWTHHM0j+khb2swyCWNTbdv6Ce316Zqx2qWFg== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/utils" "^3.27.0" + "@react-stately/slider" "^3.6.1" + "@react-types/shared" "^3.27.0" + "@react-types/slider" "^3.7.8" + "@swc/helpers" "^0.5.0" + +"@react-aria/spinbutton@^3.6.10": version "3.6.10" resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.10.tgz#72154873de807638e17570bd57e8491912b613b7" integrity sha512-nhYEYk7xUNOZDaqiQ5w/nHH9ouqjJbabTWXH+KK7UR1oVGfo4z1wG94l8KWF3Z6SGGnBxzLJyTBguZ4g9aYTSg== @@ -3170,14 +3505,26 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.9.5", "@react-aria/ssr@^3.9.7": +"@react-aria/spinbutton@^3.6.11": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.11.tgz#e6b7b740b95568851c36d4840a348b4756b33641" + integrity sha512-RM+gYS9tf9Wb+GegV18n4ArK3NBKgcsak7Nx1CkEgX9BjJ0yayWUHdfEjRRvxGXl+1z1n84cJVkZ6FUlWOWEZA== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/utils" "^3.27.0" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.7": version "3.9.7" resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770" integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/switch@^3.6.10", "@react-aria/switch@^3.6.7": +"@react-aria/switch@^3.6.10": version "3.6.10" resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.10.tgz#8fa5729bc4e76ac3df51389a8996873142daedb8" integrity sha512-FtaI9WaEP1tAmra1sYlAkYXg9x75P5UtgY8pSbe9+1WRyWbuE1QZT+RNCTi3IU4fZ7iJQmXH6+VaMyzPlSUagw== @@ -3188,7 +3535,18 @@ "@react-types/switch" "^3.5.7" "@swc/helpers" "^0.5.0" -"@react-aria/table@^3.15.2", "@react-aria/table@^3.16.0": +"@react-aria/switch@^3.6.11": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.11.tgz#cd2e2e2de005b039c7822e796b3117703198c63d" + integrity sha512-paYCpH+oeL+8rgQK+cBJ+IaZ1sXSh3+50WPlg2LvLBta0QVfQhPR4juPvfXRpfHHhCjFBgF4/RGbV8q5zpl3vA== + dependencies: + "@react-aria/toggle" "^3.10.11" + "@react-stately/toggle" "^3.8.1" + "@react-types/shared" "^3.27.0" + "@react-types/switch" "^3.5.8" + "@swc/helpers" "^0.5.0" + +"@react-aria/table@^3.16.0": version "3.16.0" resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.16.0.tgz#f0ffb51f52494e68f2c3b81fba44278fbdc48c28" integrity sha512-9xF9S3CJ7XRiiK92hsIKxPedD0kgcQWwqTMtj3IBynpQ4vsnRiW3YNIzrn9C3apjknRZDTSta8O2QPYCUMmw2A== @@ -3209,7 +3567,28 @@ "@react-types/table" "^3.10.3" "@swc/helpers" "^0.5.0" -"@react-aria/tabs@^3.9.4", "@react-aria/tabs@^3.9.8": +"@react-aria/table@^3.16.1": + version "3.16.1" + resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.16.1.tgz#06dd8a9b390057c02c059e2dfd05482ca6e97c51" + integrity sha512-T28TIGnKnPBunyErDBmm5jUX7AyzT7NVWBo9pDSt9wUuEnz0rVNd7p9sjmP2+u7I645feGG9klcdpCvFeqrk8A== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/grid" "^3.11.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/utils" "^3.27.0" + "@react-aria/visually-hidden" "^3.8.19" + "@react-stately/collections" "^3.12.1" + "@react-stately/flags" "^3.0.5" + "@react-stately/table" "^3.13.1" + "@react-types/checkbox" "^3.9.1" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@react-types/table" "^3.10.4" + "@swc/helpers" "^0.5.0" + +"@react-aria/tabs@^3.9.8": version "3.9.8" resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.8.tgz#a0a647a4e2d1783125779473536419fd8caa9cfa" integrity sha512-Nur/qRFBe+Zrt4xcCJV/ULXCS3Mlae+B89bp1Gl20vSDqk6uaPtGk+cS5k03eugOvas7AQapqNJsJgKd66TChw== @@ -3223,7 +3602,21 @@ "@react-types/tabs" "^3.3.11" "@swc/helpers" "^0.5.0" -"@react-aria/tag@^3.4.4", "@react-aria/tag@^3.4.8": +"@react-aria/tabs@^3.9.9": + version "3.9.9" + resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.9.tgz#71d35657062bbfd9d2d31ecedeaf24980e6207c7" + integrity sha512-oXPtANs16xu6MdMGLHjGV/2Zupvyp9CJEt7ORPLv5xAzSY5hSjuQHJLZ0te3Lh/KSG5/0o3RW/W5yEqo7pBQQQ== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/tabs" "^3.7.1" + "@react-types/shared" "^3.27.0" + "@react-types/tabs" "^3.3.12" + "@swc/helpers" "^0.5.0" + +"@react-aria/tag@^3.4.8": version "3.4.8" resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.4.8.tgz#856899a53c2be2b8aea3d5aca020edf8608246b2" integrity sha512-exWl52bsFtJuzaqMYvSnLteUoPqb3Wf+uICru/yRtREJsWVqjJF38NCVlU73Yqd9qMPTctDrboSZFAWAWKDxoA== @@ -3239,7 +3632,23 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@^3.14.8", "@react-aria/textfield@^3.15.0": +"@react-aria/tag@^3.4.9": + version "3.4.9" + resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.4.9.tgz#41987e7fa88c758326071da15a242181d97ec8bb" + integrity sha512-Vnps+zk8vYyjevv2Bc6vc9kSp9HFLKrKUDmrWMc0DfseypwJMc3Ya6F965ZVTjF9nuWrojNmvgusNu7qyXFShQ== + dependencies: + "@react-aria/gridlist" "^3.10.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/list" "^3.11.2" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/textfield@^3.15.0": version "3.15.0" resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.15.0.tgz#17ebac0b73f084622aaf9697576b82155bed67cb" integrity sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA== @@ -3254,6 +3663,21 @@ "@react-types/textfield" "^3.10.0" "@swc/helpers" "^0.5.0" +"@react-aria/textfield@^3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.16.0.tgz#1a20289e333d4a13db0d59301aaafcc8e010cf3a" + integrity sha512-53RVpMeMDN/QoabqnYZ1lxTh1xTQ3IBYQARuayq5EGGMafyxoFHzttxUdSqkZGK/+zdSF2GfmjOYJVm2nDKuDQ== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/form" "^3.0.12" + "@react-aria/label" "^3.7.14" + "@react-aria/utils" "^3.27.0" + "@react-stately/form" "^3.1.1" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@react-types/textfield" "^3.11.0" + "@swc/helpers" "^0.5.0" + "@react-aria/toggle@^3.10.10": version "3.10.10" resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.10.tgz#444658bf606e6d56b1fd96737d5a552c93493979" @@ -3267,6 +3691,19 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-aria/toggle@^3.10.11": + version "3.10.11" + resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.11.tgz#7873648bc83041570d149c234c531639f5346168" + integrity sha512-J3jO3KJiUbaYVDEpeXSBwqcyKxpi9OreiHRGiaxb6VwB+FWCj7Gb2WKajByXNyfs8jc6kX9VUFaXa7jze60oEQ== + dependencies: + "@react-aria/focus" "^3.19.1" + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/toggle" "^3.8.1" + "@react-types/checkbox" "^3.9.1" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-aria/toolbar@3.0.0-beta.11": version "3.0.0-beta.11" resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.11.tgz#019c9ff2a47ad207504a95afeb0f863cf71a114b" @@ -3278,18 +3715,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/toolbar@3.0.0-beta.8": - version "3.0.0-beta.8" - resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.8.tgz#2846f22c9c524ec75d577f9edddc4d534cc48fcd" - integrity sha512-nMlA1KK54/Kohb3HlHAzobg69PVIEr8Q1j5P3tLd9apY8FgGvnz7yLpcj6kO1GA872gseEzgiO0Rzk+yRHQRCA== +"@react-aria/toolbar@3.0.0-beta.12": + version "3.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.12.tgz#b1bf229df637953150be480ac09eec9274c5e75a" + integrity sha512-a+Be27BtM2lzEdTzm19FikPbitfW65g/JZln3kyAvgpswhU6Ljl8lztaVw4ixjG4H0nqnKvVggMy4AlWwDUaVQ== dependencies: - "@react-aria/focus" "^3.18.2" - "@react-aria/i18n" "^3.12.2" - "@react-aria/utils" "^3.25.2" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/tooltip@^3.7.10", "@react-aria/tooltip@^3.7.7": +"@react-aria/tooltip@^3.7.10": version "3.7.10" resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.10.tgz#d710532e80337e50be818dfbf2cc54d0a9b8c592" integrity sha512-Udi3XOnrF/SYIz72jw9bgB74MG/yCOzF5pozHj2FH2HiJlchYv/b6rHByV/77IZemdlkmL/uugrv/7raPLSlnw== @@ -3302,18 +3739,17 @@ "@react-types/tooltip" "^3.4.13" "@swc/helpers" "^0.5.0" -"@react-aria/tree@3.0.0-alpha.4": - version "3.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/@react-aria/tree/-/tree-3.0.0-alpha.4.tgz#b98c170f09d2b5039eba5ddfd6cacad2929076ff" - integrity sha512-a35/clOnkMIF6vLJQWRHJfUzZLAld+XYRZ/vbs+FihZZYgVxgfGT6QKxf4yMPKVx5JKrtkFJ/UCxV+pUPcSyyg== +"@react-aria/tooltip@^3.7.11": + version "3.7.11" + resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.11.tgz#f02822496e77d7bd5664aeda8670e8428288d7e7" + integrity sha512-mhZgAWUj7bUWipDeJXaVPZdqnzoBCd/uaEbdafnvgETmov1udVqPTh9w4ZKX2Oh1wa2+OdLFrBOk+8vC6QbWag== dependencies: - "@react-aria/gridlist" "^3.9.2" - "@react-aria/i18n" "^3.12.2" - "@react-aria/selection" "^3.19.2" - "@react-aria/utils" "^3.25.2" - "@react-stately/tree" "^3.8.4" - "@react-types/button" "^3.9.6" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/tooltip" "^3.5.1" + "@react-types/shared" "^3.27.0" + "@react-types/tooltip" "^3.4.14" "@swc/helpers" "^0.5.0" "@react-aria/tree@3.0.0-beta.2": @@ -3330,7 +3766,21 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.25.2", "@react-aria/utils@^3.26.0": +"@react-aria/tree@3.0.0-beta.3": + version "3.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@react-aria/tree/-/tree-3.0.0-beta.3.tgz#bc360c5c96bcc07beb054e55f493c7097731df8f" + integrity sha512-eQnCtvDgpunCHInIT+Da3qdgzDzKEFW9REX2j1vMqWTsbM1YikVlBzB9AJOd9KIAWyn+p4TYdL8zzPWxvuSdfA== + dependencies: + "@react-aria/gridlist" "^3.10.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/selection" "^3.22.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/tree" "^3.8.7" + "@react-types/button" "^3.10.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.26.0": version "3.26.0" resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.26.0.tgz#833cbfa33e75d15835b757791b3f754432d2f948" integrity sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ== @@ -3341,7 +3791,18 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/virtualizer@^4.0.2", "@react-aria/virtualizer@^4.1.0": +"@react-aria/utils@^3.27.0": + version "3.27.0" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.27.0.tgz#92a58177c60055bb007c2e886d2d914f42df2386" + integrity sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw== + dependencies: + "@react-aria/ssr" "^3.9.7" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/virtualizer@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@react-aria/virtualizer/-/virtualizer-4.1.0.tgz#df00bfba82fa5e0d622cc24699be67a60be7ab4f" integrity sha512-ziSq3Y7iuaAMJWGZU1RRs/TykuPapQfx8dyH2eyKPLgEjBUoXRGWE7n6jklBwal14b0lPK0wkCzRoQbkUvX3cg== @@ -3353,7 +3814,19 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/visually-hidden@^3.8.15", "@react-aria/visually-hidden@^3.8.18": +"@react-aria/virtualizer@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@react-aria/virtualizer/-/virtualizer-4.1.1.tgz#54216b13393a55cf7b73577d9cc039033364d6cb" + integrity sha512-AYQmC/S9HhxGOj8HkQdxDW8/+sUEmmfcGpjkInzXB8UZCB1FQLC0LpvA8fOP7AfzLaAL+HVcYF5BvnGMPijHTQ== + dependencies: + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-stately/virtualizer" "^4.2.1" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/visually-hidden@^3.8.18": version "3.8.18" resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.18.tgz#13c168736944cbe19cd8917ec33a4e6f5f694119" integrity sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ== @@ -3363,6 +3836,16 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-aria/visually-hidden@^3.8.19": + version "3.8.19" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.19.tgz#4717f6d4333dfa901fa1805c289a025ca0e9dbfc" + integrity sha512-MZgCCyQ3sdG94J5iJz7I7Ai3IxoN0U5d/+EaUnA1mfK7jf2fSYQBqi6Eyp8sWUYzBTLw4giXB5h0RGAnWzk9hA== + dependencies: + "@react-aria/interactions" "^3.23.0" + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-pdf/fns@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-pdf/fns/-/fns-3.0.0.tgz#2e0137d48b14c531b2f6a9214cb36ea2a7aea3ba" @@ -3502,18 +3985,15 @@ resolved "https://registry.yarnpkg.com/@react-pdf/types/-/types-2.7.0.tgz#56a0232ce420c313fe67cef193cbf57870a01477" integrity sha512-7KrPPCpgRPKR+g+T127PE4bpw9Q84ZiY07EYRwXKVtTEVW9wJ5BZiF9smT9IvH19s+MQaDLmYRgjESsnqlyH0Q== -"@react-stately/calendar@3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.5.4.tgz#847b2a2e5cf13a81b3344f1ef4e9a0d10138191e" - integrity sha512-R2011mtFSXIjzMXaA+CZ1sflPm9XkTBMqVk77Bnxso2ZsG7FUX8nqFmaDavxwTuHFC6OUexAGSMs8bP9KycTNg== +"@react-stately/autocomplete@3.0.0-alpha.0": + version "3.0.0-alpha.0" + resolved "https://registry.yarnpkg.com/@react-stately/autocomplete/-/autocomplete-3.0.0-alpha.0.tgz#3b80c82ba50d682dbbdd2f1f2c8b6ecc059f8afc" + integrity sha512-as4si0pBcnGnggwpvemMwCLTeV0h9GS9e5eHSR3RFg14eqUHZBEzYJ0kh9oTugpsGuf1TSM/HDizo8GQk3EtPA== dependencies: - "@internationalized/date" "^3.5.5" - "@react-stately/utils" "^3.10.3" - "@react-types/calendar" "^3.4.9" - "@react-types/shared" "^3.24.1" + "@react-stately/utils" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@^3.5.4", "@react-stately/calendar@^3.6.0": +"@react-stately/calendar@3.6.0", "@react-stately/calendar@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.6.0.tgz#c770890160c33826206a015eb7da32fe8ece81d5" integrity sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA== @@ -3524,7 +4004,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@^3.6.10", "@react-stately/checkbox@^3.6.8": +"@react-stately/calendar@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.7.0.tgz#2c1391173a077734f74e1e27cab6da333ca1d0e5" + integrity sha512-N15zKubP2S7eWfPSJjKVlmJA7YpWzrIGx52BFhwLSQAZcV+OPcMgvOs71WtB7PLwl6DUYQGsgc0B3tcHzzvdvQ== + dependencies: + "@internationalized/date" "^3.7.0" + "@react-stately/utils" "^3.10.5" + "@react-types/calendar" "^3.6.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/checkbox@^3.6.10": version "3.6.10" resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.10.tgz#69b619fdfcf1e15d2d93392e13289a36d85a8a6c" integrity sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ== @@ -3535,7 +4026,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/collections@^3.10.9", "@react-stately/collections@^3.12.0": +"@react-stately/checkbox@^3.6.11": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.11.tgz#91cead7b40a8aa6e198a7191d2ffeb1cdc59054a" + integrity sha512-jApdBis+Q1sXLivg+f7krcVaP/AMMMiQcVqcz5gwxlweQN+dRZ/NpL0BYaDOuGc26Mp0lcuVaET3jIZeHwtyxA== + dependencies: + "@react-stately/form" "^3.1.1" + "@react-stately/utils" "^3.10.5" + "@react-types/checkbox" "^3.9.1" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/collections@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.0.tgz#6240d3517d0d86f7d9eb4997108fb432d569e8d7" integrity sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA== @@ -3543,7 +4045,15 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/color@^3.7.2", "@react-stately/color@^3.8.1": +"@react-stately/collections@^3.12.1": + version "3.12.1" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.1.tgz#3a0af2555f95c339706a68e51b8f828df5d9ee7f" + integrity sha512-8QmFBL7f+P64dEP4o35pYH61/lP0T/ziSdZAvNMrCqaM+fXcMfUp2yu1E63kADVX7WRDsFJWE3CVMeqirPH6Xg== + dependencies: + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/color@^3.8.1": version "3.8.1" resolved "https://registry.yarnpkg.com/@react-stately/color/-/color-3.8.1.tgz#13969f61f1c1b468fd891cc94582056fc2da9b9b" integrity sha512-7eN7K+KJRu+rxK351eGrzoq2cG+yipr90i5b1cUu4lioYmcH4WdsfjmM5Ku6gypbafH+kTDfflvO6hiY1NZH+A== @@ -3559,7 +4069,22 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@^3.10.1", "@react-stately/combobox@^3.9.2": +"@react-stately/color@^3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@react-stately/color/-/color-3.8.2.tgz#7d542d1e45d8fe2f9d590c67d8cfea4315d8002a" + integrity sha512-GXwLmv1Eos2OwOiRsGFrXBKx8+uZh2q0qzLZEVYrWsedNhIdTm7nnpwO68nCYZPHkqhv6rhhVSlOOFmDLY++ow== + dependencies: + "@internationalized/number" "^3.6.0" + "@internationalized/string" "^3.2.5" + "@react-stately/form" "^3.1.1" + "@react-stately/numberfield" "^3.9.9" + "@react-stately/slider" "^3.6.1" + "@react-stately/utils" "^3.10.5" + "@react-types/color" "^3.0.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/combobox@^3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.1.tgz#ebae28c5341d06d69cc8e50055fa816dee19522b" integrity sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg== @@ -3574,7 +4099,22 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/data@^3.11.6", "@react-stately/data@^3.12.0": +"@react-stately/combobox@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.2.tgz#2a6d861d7464f62d82e5f1859bb15e981fd0b0e9" + integrity sha512-uT642Dool4tQBh+8UQjlJnTisrJVtg3LqmiP/HqLQ4O3pW0O+ImbG+2r6c9dUzlAnH4kEfmEwCp9dxkBkmFWsg== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/form" "^3.1.1" + "@react-stately/list" "^3.11.2" + "@react-stately/overlays" "^3.6.13" + "@react-stately/select" "^3.6.10" + "@react-stately/utils" "^3.10.5" + "@react-types/combobox" "^3.13.2" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/data@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.12.0.tgz#4f0fd89be2fa64ca7c0ad92d8cf20f2cba961fc0" integrity sha512-6PiW2oA56lcH1CVjDcajutzsv91w/PER8K61/OGxtNFFUWaIZH80RWmK4kjU/Lf0vygzXCxout3kEb388lUk0w== @@ -3582,21 +4122,15 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@3.10.2": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.10.2.tgz#2023e5cfc71240e8557720f1c3dfbe03207083bf" - integrity sha512-pa5IZUw+49AyOnddwu4XwU2kI5eo/1thbiIVNHP8uDpbbBrBkquSk3zVFDAGX1cu/I1U2VUkt64U/dxgkwaMQw== +"@react-stately/data@^3.12.1": + version "3.12.1" + resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.12.1.tgz#d1f3a9e8a80d882d0987f6b99f2a2b37db11a945" + integrity sha512-/Nc8X1FmrJ53QU4rN/1i1JtNir4iqo+39Xn5ZOJ74Nng7T+xVVuEuWSo+OEGaycCJf2eZRsomauPxUnnZgCM1A== dependencies: - "@internationalized/date" "^3.5.5" - "@internationalized/string" "^3.2.3" - "@react-stately/form" "^3.0.5" - "@react-stately/overlays" "^3.6.10" - "@react-stately/utils" "^3.10.3" - "@react-types/datepicker" "^3.8.2" - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@^3.10.2", "@react-stately/datepicker@^3.11.0": +"@react-stately/datepicker@3.11.0", "@react-stately/datepicker@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.11.0.tgz#5f4daff449f756dc40b4201ae337dd4a3f29facc" integrity sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg== @@ -3610,6 +4144,20 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-stately/datepicker@^3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.12.0.tgz#c9e5d0694a4d8bf0dbb3e795b81dfa0eb5f1e7a2" + integrity sha512-AfJEP36d+QgQ30GfacXtYdGsJvqY2yuCJ+JrjHct+m1nYuTkMvMMnhwNBFasgDJPLCDyHzyANlWkl2kQGfsBFw== + dependencies: + "@internationalized/date" "^3.7.0" + "@internationalized/string" "^3.2.5" + "@react-stately/form" "^3.1.1" + "@react-stately/overlays" "^3.6.13" + "@react-stately/utils" "^3.10.5" + "@react-types/datepicker" "^3.10.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-stately/disclosure@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-stately/disclosure/-/disclosure-3.0.0.tgz#6eca061727eb27e391cc09a871f838228c597e14" @@ -3619,7 +4167,16 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/dnd@^3.4.2", "@react-stately/dnd@^3.5.0": +"@react-stately/disclosure@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-stately/disclosure/-/disclosure-3.0.1.tgz#ea79036cb08e854020856b77be81e3abd99b0700" + integrity sha512-afpNy5b0UcqRGjU/W5OD0xkx4PbymvhMrgQZ4o4OdtDVMMvr9T5UqMF8/j3J591DxgQfXM872tJu0kotqT0L6Q== + dependencies: + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/dnd@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.5.0.tgz#3061233709f7113f6492de33204aea507c243a2e" integrity sha512-ZcWFw1npEDnATiy3TEdzA1skQ3UEIyfbNA6VhPNO8yiSVLxoxBOaEaq8VVS72fRGAtxud6dgOy8BnsP9JwDClQ== @@ -3628,6 +4185,15 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-stately/dnd@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.5.1.tgz#fb2483df0abdb34352a06e36d199c016f315977d" + integrity sha512-N18wt6fka9ngJJqxfAzmdtyrk9whAnqWUxZn22CatjNQsqukI4a6KRYwZTXM9x/wm7KamhVOp+GBl85zM8GLdA== + dependencies: + "@react-stately/selection" "^3.19.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-stately/flags@^3.0.5": version "3.0.5" resolved "https://registry.yarnpkg.com/@react-stately/flags/-/flags-3.0.5.tgz#b35bcbd3b80c4f821e23e9c649566a4af11e97bf" @@ -3635,7 +4201,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@^3.0.5", "@react-stately/form@^3.1.0": +"@react-stately/form@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.0.tgz#7fdb4ca153be18e7516a02e507ada393ad38945d" integrity sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big== @@ -3643,6 +4209,14 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-stately/form@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.1.tgz#46980c7b64a785497936a379a67c0dfa8f3c76f7" + integrity sha512-qavrz5X5Mdf/Q1v/QJRxc0F8UTNEyRCNSM1we/nnF7GV64+aYSDLOtaRGmzq+09RSwo1c8ZYnIkK5CnwsPhTsQ== + dependencies: + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + "@react-stately/grid@^3.10.0": version "3.10.0" resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.10.0.tgz#d74e46f85a662092c61812a8508cf4ac8721ec6d" @@ -3654,7 +4228,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/layout@^4.0.2", "@react-stately/layout@^4.1.0": +"@react-stately/grid@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.10.1.tgz#2d13d30950a5ae83e15f266ccad710b4dad4a6c5" + integrity sha512-MOIy//AdxZxIXIzvWSKpvMvaPEMZGQNj+/cOsElHepv/Veh0psNURZMh2TP6Mr0+MnDTZbX+5XIeinGkWYO3JQ== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/selection" "^3.19.0" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/layout@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-4.1.0.tgz#dd5c376c6dee90922597bcd7af2d7dedfabb6c82" integrity sha512-pSBqn+4EeOaf2QMK+w2SHgsWKYHdgMZWY3qgJijdzWGZ4JpYmHuiD0yOq80qFdUwxcexPW3vFg3hqIQlMpXeCw== @@ -3667,7 +4252,20 @@ "@react-types/table" "^3.10.3" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.10.8", "@react-stately/list@^3.11.1": +"@react-stately/layout@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-4.1.1.tgz#26e718ad9c1c102ba7d40ceff7ce67264adbf3d5" + integrity sha512-kXeo7HKYTOcqMKru1sKFoMoZA+YywSUqHeIA90MptzRugbFhQGq4nUbIYM2p3FeHAX9HU1JAXThuLcwDOHhB8Q== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/table" "^3.13.1" + "@react-stately/virtualizer" "^4.2.1" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@react-types/table" "^3.10.4" + "@swc/helpers" "^0.5.0" + +"@react-stately/list@^3.11.1": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.1.tgz#d1493e5b9c5cac6cafb3cb3a6edb852bf3cb208f" integrity sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg== @@ -3678,7 +4276,18 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.8.2", "@react-stately/menu@^3.9.0": +"@react-stately/list@^3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.2.tgz#11f1002707dfb54af391a24ca8ef063b6a8cde26" + integrity sha512-eU2tY3aWj0SEeC7lH9AQoeAB4LL9mwS54FvTgHHoOgc1ZIwRJUaZoiuETyWQe98AL8KMgR1nrnDJ1I+CcT1Y7g== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/selection" "^3.19.0" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/menu@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.0.tgz#b1e55996405f4e43ff844cbd325df9842914efe4" integrity sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ== @@ -3688,7 +4297,17 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/numberfield@^3.9.6", "@react-stately/numberfield@^3.9.8": +"@react-stately/menu@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.1.tgz#fc01957ed8e01e7d85c0b6bd21bc8087b4df59f3" + integrity sha512-WRjGGImhQlQaer/hhahGytwd1BDq3fjpTkY/04wv3cQJPJR6lkVI5nSvGFMHfCaErsA1bNyB8/T9Y5F5u4u9ng== + dependencies: + "@react-stately/overlays" "^3.6.13" + "@react-types/menu" "^3.9.14" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/numberfield@^3.9.8": version "3.9.8" resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.9.8.tgz#863a6c0f7a4249759dd0c586f2e27dd2548aadee" integrity sha512-J6qGILxDNEtu7yvd3/y+FpbrxEaAeIODwlrFo6z1kvuDlLAm/KszXAc75yoDi0OtakFTCMP6/HR5VnHaQdMJ3w== @@ -3699,7 +4318,18 @@ "@react-types/numberfield" "^3.8.7" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.6.10", "@react-stately/overlays@^3.6.12": +"@react-stately/numberfield@^3.9.9": + version "3.9.9" + resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.9.9.tgz#a7d2d756aee8dd2df0eb1b0c1ab657148de4a439" + integrity sha512-hZsLiGGHTHmffjFymbH1qVmA633rU2GNjMFQTuSsN4lqqaP8fgxngd5pPCoTCUFEkUgWjdHenw+ZFByw8lIE+g== + dependencies: + "@internationalized/number" "^3.6.0" + "@react-stately/form" "^3.1.1" + "@react-stately/utils" "^3.10.5" + "@react-types/numberfield" "^3.8.8" + "@swc/helpers" "^0.5.0" + +"@react-stately/overlays@^3.6.12": version "3.6.12" resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.12.tgz#beb594a0e140dbd7957bfa181006854f91480bea" integrity sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw== @@ -3708,7 +4338,27 @@ "@react-types/overlays" "^3.8.11" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.10.7", "@react-stately/radio@^3.10.9": +"@react-stately/overlays@^3.6.13": + version "3.6.13" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.13.tgz#37cd757d3404d0fb827216a8e11dbce8ea2186c7" + integrity sha512-WsU85Gf/b+HbWsnnYw7P/Ila3wD+C37Uk/WbU4/fHgJ26IEOWsPE6wlul8j54NZ1PnLNhV9Fn+Kffi+PaJMQXQ== + dependencies: + "@react-stately/utils" "^3.10.5" + "@react-types/overlays" "^3.8.12" + "@swc/helpers" "^0.5.0" + +"@react-stately/radio@^3.10.10": + version "3.10.10" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.10.tgz#1507265e66ce2d200f0d2127f1659ba0d7f53fba" + integrity sha512-9x3bpq87uV8iYA4NaioTTWjriQSlSdp+Huqlxll0T3W3okpyraTTejE91PbIoRTUmL5qByIh2WzxYmr4QdBgAA== + dependencies: + "@react-stately/form" "^3.1.1" + "@react-stately/utils" "^3.10.5" + "@react-types/radio" "^3.8.6" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/radio@^3.10.9": version "3.10.9" resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.9.tgz#cf74b8f47cbef56836424d2e7d06c01fe9d9ea05" integrity sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw== @@ -3719,7 +4369,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/searchfield@^3.5.6", "@react-stately/searchfield@^3.5.8": +"@react-stately/searchfield@^3.5.8": version "3.5.8" resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.8.tgz#b927e25afd32b1a32f22d54df6d7b4968cb4cf33" integrity sha512-jtquvGadx1DmtQqPKaVO6Qg/xpBjNxsOd59ciig9xRxpxV+90i996EX1E2R6R+tGJdSM1pD++7PVOO4yE++HOg== @@ -3728,7 +4378,28 @@ "@react-types/searchfield" "^3.5.10" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.6.7", "@react-stately/select@^3.6.9": +"@react-stately/searchfield@^3.5.9": + version "3.5.9" + resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.9.tgz#0e552c1928b9affb6dfd6de280c2d9aca8486b73" + integrity sha512-7/aO/oLJ4czKEji0taI/lbHKqPJRag9p3YmRaZ4yqjIMpKxzmJCWQcov5lzWeFhG/1hINKndYlxFnVIKV/urpg== + dependencies: + "@react-stately/utils" "^3.10.5" + "@react-types/searchfield" "^3.5.11" + "@swc/helpers" "^0.5.0" + +"@react-stately/select@^3.6.10": + version "3.6.10" + resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.10.tgz#ecfb1fb286f810c05cdd6b5050869ac42316ad03" + integrity sha512-V7V0FCL9T+GzLjyfnJB6PUaKldFyT/8Rj6M+R9ura1A0O+s/FEOesy0pdMXFoL1l5zeUpGlCnhJrsI5HFWHfDw== + dependencies: + "@react-stately/form" "^3.1.1" + "@react-stately/list" "^3.11.2" + "@react-stately/overlays" "^3.6.13" + "@react-types/select" "^3.9.9" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/select@^3.6.9": version "3.6.9" resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.9.tgz#088bb0fe7b16cc67d833f17c330df63c4310a5da" integrity sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg== @@ -3740,7 +4411,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/selection@^3.16.2", "@react-stately/selection@^3.18.0": +"@react-stately/selection@^3.18.0": version "3.18.0" resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.18.0.tgz#eb723dc26eafd9b016c55056fb550bdde8b4f87b" integrity sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg== @@ -3750,7 +4421,17 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.5.7", "@react-stately/slider@^3.6.0": +"@react-stately/selection@^3.19.0": + version "3.19.0" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.19.0.tgz#e81357d94330c06bfc3a842f454be93c5c089b28" + integrity sha512-AvbUqnWjqVQC48RD39S9BpMKMLl55Zo5l/yx5JQFPl55cFwe9Tpku1KY0wzt3fXXiXWaqjDn/7Gkg1VJYy8esQ== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/slider@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.0.tgz#20439e08915725c4f6ba2285a561ae92fe59d997" integrity sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag== @@ -3760,7 +4441,17 @@ "@react-types/slider" "^3.7.7" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.12.2", "@react-stately/table@^3.13.0": +"@react-stately/slider@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.1.tgz#2e410dd8232aaf74f384616c5af70f375514662c" + integrity sha512-8kij5O82Xe233vZZ6qNGqPXidnlNQiSnyF1q613c7ktFmzAyGjkIWVUapHi23T1fqm7H2Rs3RWlmwE9bo2KecA== + dependencies: + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@react-types/slider" "^3.7.8" + "@swc/helpers" "^0.5.0" + +"@react-stately/table@^3.13.0": version "3.13.0" resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.13.0.tgz#8465030f568b5ee779623d99b2ef22940a99a6cd" integrity sha512-mRbNYrwQIE7xzVs09Lk3kPteEVFVyOc20vA8ph6EP54PiUf/RllJpxZe/WUYLf4eom9lUkRYej5sffuUBpxjCA== @@ -3775,7 +4466,22 @@ "@react-types/table" "^3.10.3" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.6.9", "@react-stately/tabs@^3.7.0": +"@react-stately/table@^3.13.1": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.13.1.tgz#dd621097b0c1e74e60509491d960f5d63ada0bf4" + integrity sha512-Im8W+F8o9EhglY5kqRa3xcMGXl8zBi6W5phGpAjXb+UGDL1tBIlAcYj733bw8g/ITCnaSz9ubsmON0HekPd6Jg== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/flags" "^3.0.5" + "@react-stately/grid" "^3.10.1" + "@react-stately/selection" "^3.19.0" + "@react-stately/utils" "^3.10.5" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@react-types/table" "^3.10.4" + "@swc/helpers" "^0.5.0" + +"@react-stately/tabs@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.7.0.tgz#f849b334c5e7d39a37c2e9ffa3114531bf8ce6e4" integrity sha512-ox4hTkfZCoR4Oyr3Op3rBlWNq2Wxie04vhEYpTZQ2hobR3l4fYaOkd7CPClILktJ3TC104j8wcb0knWxIBRx9w== @@ -3785,7 +4491,17 @@ "@react-types/tabs" "^3.3.11" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.7.7", "@react-stately/toggle@^3.8.0": +"@react-stately/tabs@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.7.1.tgz#342fac307357c277e9a6e17dba077ea784b8ace2" + integrity sha512-gr9ACyuWrYuc727h7WaHdmNw8yxVlUyQlguziR94MdeRtFGQnf3V6fNQG3kxyB77Ljko69tgDF7Nf6kfPUPAQQ== + dependencies: + "@react-stately/list" "^3.11.2" + "@react-types/shared" "^3.27.0" + "@react-types/tabs" "^3.3.12" + "@swc/helpers" "^0.5.0" + +"@react-stately/toggle@^3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.0.tgz#39a3e45989f56e236809d8fe69c160cc88a616f5" integrity sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw== @@ -3795,7 +4511,17 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.4.12", "@react-stately/tooltip@^3.5.0": +"@react-stately/toggle@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.1.tgz#3ab375d910f417a57bf457dfb0f1e0dd14d2e7f8" + integrity sha512-MVpe79ghVQiwLmVzIPhF/O/UJAUc9B+ZSylVTyJiEPi0cwhbkKGQv9thOF0ebkkRkace5lojASqUAYtSTZHQJA== + dependencies: + "@react-stately/utils" "^3.10.5" + "@react-types/checkbox" "^3.9.1" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/tooltip@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.5.0.tgz#1016952eb4427d5b848e2efcb24eee47e2a26b59" integrity sha512-+xzPNztJDd2XJD0X3DgWKlrgOhMqZpSzsIssXeJgO7uCnP8/Z513ESaipJhJCFC8fxj5caO/DK4Uu8hEtlB8cQ== @@ -3804,7 +4530,16 @@ "@react-types/tooltip" "^3.4.13" "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.8.4", "@react-stately/tree@^3.8.6": +"@react-stately/tooltip@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.5.1.tgz#b002cdd7e652c3deaae48daa736f74ad7040f2d4" + integrity sha512-0aI3U5kB7Cop9OCW9/Bag04zkivFSdUcQgy/TWL4JtpXidVWmOha8txI1WySawFSjZhH83KIyPc+wKm1msfLMQ== + dependencies: + "@react-stately/overlays" "^3.6.13" + "@react-types/tooltip" "^3.4.14" + "@swc/helpers" "^0.5.0" + +"@react-stately/tree@^3.8.6": version "3.8.6" resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.6.tgz#85dc33c5d5b9a455ffc0b474300957e511db1ea4" integrity sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA== @@ -3815,14 +4550,25 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.10.3", "@react-stately/utils@^3.10.5": +"@react-stately/tree@^3.8.7": + version "3.8.7" + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.7.tgz#4eb80212d9dd7c1522d65a14dc039818da690891" + integrity sha512-hpc3pyuXWeQV5ufQ02AeNQg/MYhnzZ4NOznlY5OOUoPzpLYiI3ZJubiY3Dot4jw5N/LR7CqvDLHmrHaJPmZlHg== + dependencies: + "@react-stately/collections" "^3.12.1" + "@react-stately/selection" "^3.19.0" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/utils@^3.10.4", "@react-stately/utils@^3.10.5": version "3.10.5" resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.5.tgz#47bb91cd5afd1bafe39353614e5e281b818ebccc" integrity sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ== dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^4.0.2", "@react-stately/virtualizer@^4.2.0": +"@react-stately/virtualizer@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-4.2.0.tgz#5906ac9d10ec48bc12a81879991a0b05154605d6" integrity sha512-aTMpa9AQoz/xLqn8AI1BR/caUUY7/OUo9GbuF434w2u5eGCL7+SAn3Fmq7WSCwqYyDsO+jEIERek4JTX7pEW0A== @@ -3831,6 +4577,32 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" +"@react-stately/virtualizer@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-4.2.1.tgz#da001c17794ba171c414be44ce95918e3a5fe085" + integrity sha512-GHGEXV0ZRhq34U/P3LzkByCBfy2IDynYlV1SE4njkUWWGE/0AH56UegM6w2l3GeiNpXsXCgXl7jpAKeIGMEnrQ== + dependencies: + "@react-aria/utils" "^3.27.0" + "@react-types/shared" "^3.27.0" + "@swc/helpers" "^0.5.0" + +"@react-types/autocomplete@3.0.0-alpha.28": + version "3.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/@react-types/autocomplete/-/autocomplete-3.0.0-alpha.28.tgz#0dc91682abcde43ec3c80a254eddfc0c002539c4" + integrity sha512-meHxBVS5H2L7lVOX99jiAfhcvtG0s7EE7iF7X20/yqEnkwWSpyeMKcDKFpvx/bLGUSmRTVFCBLgvPpwUyhcFkg== + dependencies: + "@react-types/combobox" "^3.13.2" + "@react-types/searchfield" "^3.5.11" + "@react-types/shared" "^3.27.0" + +"@react-types/breadcrumbs@^3.7.10": + version "3.7.10" + resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.10.tgz#4d5b84460890107e6438b8d00025557cc7163237" + integrity sha512-5HhRxkKHfAQBoyOYzyf4HT+24HgPE/C/QerxJLNNId303LXO03yeYrbvRqhYZSlD1ACLJW9OmpPpREcw5iSqgw== + dependencies: + "@react-types/link" "^3.5.10" + "@react-types/shared" "^3.27.0" + "@react-types/breadcrumbs@^3.7.9": version "3.7.9" resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.9.tgz#c75eae6158bd3631854bff7521c2373b42b0e37c" @@ -3839,14 +4611,21 @@ "@react-types/link" "^3.5.9" "@react-types/shared" "^3.26.0" -"@react-types/button@^3.10.1", "@react-types/button@^3.9.6": +"@react-types/button@^3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.1.tgz#fc7ada2e83bc661b31c1473a82ec86dc11de057c" integrity sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA== dependencies: "@react-types/shared" "^3.26.0" -"@react-types/calendar@^3.4.9", "@react-types/calendar@^3.5.0": +"@react-types/button@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.2.tgz#60ce0d4a16690d94a8ae23bb00207c8af9616919" + integrity sha512-h8SB/BLoCgoBulCpyzaoZ+miKXrolK9XC48+n1dKJXT8g4gImrficurDW6+PRTQWaRai0Q0A6bu8UibZOU4syg== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/calendar@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.5.0.tgz#a72fa15e08c7785b145005560baa35ad9b44627b" integrity sha512-O3IRE7AGwAWYnvJIJ80cOy7WwoJ0m8GtX/qSmvXQAjC4qx00n+b5aFNBYAQtcyc3RM5QpW6obs9BfwGetFiI8w== @@ -3854,6 +4633,14 @@ "@internationalized/date" "^3.6.0" "@react-types/shared" "^3.26.0" +"@react-types/calendar@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.6.0.tgz#4cfaa261cce621b77ef0705d0f9c07da774a007b" + integrity sha512-BtFh4BFwvsYlsaSqUOVxlqXZSlJ6u4aozgO3PwHykhpemwidlzNwm9qDZhcMWPioNF/w2cU/6EqhvEKUHDnFZg== + dependencies: + "@internationalized/date" "^3.7.0" + "@react-types/shared" "^3.27.0" + "@react-types/checkbox@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.9.0.tgz#d4621fef81850543f7a028917e9c2781cd871443" @@ -3861,13 +4648,12 @@ dependencies: "@react-types/shared" "^3.26.0" -"@react-types/color@3.0.0-rc.1": - version "3.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.0-rc.1.tgz#d7503ae76b0abea07af35926aa0d15e7721dd54c" - integrity sha512-aw6FzrBlZTWKrFaFskM7e3AFICe6JqH10wO0E919goa3LZDDFbyYEwRpatwjIyiZH1elEUkFPgwqpv3ZcPPn8g== +"@react-types/checkbox@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.9.1.tgz#6ba0153f3f498af211112eab6e31d243170d5004" + integrity sha512-0x/KQcipfNM9Nvy6UMwYG25roRLvsiqf0J3woTYylNNWzF+72XT0iI5FdJkE3w2wfa0obmSoeq4WcbFREQrH/A== dependencies: - "@react-types/shared" "^3.24.1" - "@react-types/slider" "^3.7.5" + "@react-types/shared" "^3.27.0" "@react-types/color@^3.0.1": version "3.0.1" @@ -3877,6 +4663,14 @@ "@react-types/shared" "^3.26.0" "@react-types/slider" "^3.7.7" +"@react-types/color@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.2.tgz#e8a1a3be5689e3c128d50a4d30f5bbb2d46d88e9" + integrity sha512-4k9c0l5SACwTtkHV0dQ0GrF0Kktk/NChkxtyu58BamyUQOsCe8sqny+uul2nPrqQvuVof/dkRjKhv/DVyyx2mw== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/slider" "^3.7.8" + "@react-types/combobox@^3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.1.tgz#d7d843f45501ad141f74ba62ed46d2e991b2d6a0" @@ -3884,7 +4678,24 @@ dependencies: "@react-types/shared" "^3.26.0" -"@react-types/datepicker@^3.8.2", "@react-types/datepicker@^3.9.0": +"@react-types/combobox@^3.13.2": + version "3.13.2" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.2.tgz#b6ee140166691e59bebe57f082dc6127f9bb7210" + integrity sha512-yl2yMcM5/v3lJiNZWjpAhQ9vRW6dD55CD4rYmO2K7XvzYJaFVT4WYI/AymPYD8RqomMp7coBmBHfHW0oupk8gg== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/datepicker@^3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.10.0.tgz#4557c2d22a52fb7340ca27e6eba4d23556684e84" + integrity sha512-Att7y4NedNH1CogMDIX9URXgMLxGbZgnFCZ8oxgFAVndWzbh3TBcc4s7uoJDPvgRMAalq+z+SrlFFeoBeJmvvg== + dependencies: + "@internationalized/date" "^3.7.0" + "@react-types/calendar" "^3.6.0" + "@react-types/overlays" "^3.8.12" + "@react-types/shared" "^3.27.0" + +"@react-types/datepicker@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.9.0.tgz#86e2a4e23e9fbf8299a12bd8aba9b1a52cf44725" integrity sha512-dbKL5Qsm2MQwOTtVQdOcKrrphcXAqDD80WLlSQrBLg+waDuuQ7H+TrvOT0thLKloNBlFUGnZZfXGRHINpih/0g== @@ -3894,7 +4705,7 @@ "@react-types/overlays" "^3.8.11" "@react-types/shared" "^3.26.0" -"@react-types/dialog@^3.5.12", "@react-types/dialog@^3.5.14": +"@react-types/dialog@^3.5.14": version "3.5.14" resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.14.tgz#97e568dc38ede4312ba6a12eda855c5e32c7cd47" integrity sha512-OXWMjrALwrlgw8aHD8SeRm/s3tbAssdaEh2h73KUSeFau3fU3n5mfKv+WnFqsEaOtN261o48l7hTlS6615H9AA== @@ -3902,20 +4713,49 @@ "@react-types/overlays" "^3.8.11" "@react-types/shared" "^3.26.0" -"@react-types/form@^3.7.6", "@react-types/form@^3.7.8": +"@react-types/dialog@^3.5.15": + version "3.5.15" + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.15.tgz#abf7c16c41808b80ac7300f9dc4a8a1ba72020ee" + integrity sha512-BX1+mV35Oa0aIlhu98OzJaSB7uiCWDPQbr0AkpFBajSSlESUoAjntN+4N+QJmj24z2v6UE9zxGQ85/U/0Le+bw== + dependencies: + "@react-types/overlays" "^3.8.12" + "@react-types/shared" "^3.27.0" + +"@react-types/form@^3.7.8": version "3.7.8" resolved "https://registry.yarnpkg.com/@react-types/form/-/form-3.7.8.tgz#4d6b9e78770b9345cc9e1041990a7a26fb65e0ee" integrity sha512-0wOS97/X0ijTVuIqik1lHYTZnk13QkvMTKvIEhM7c6YMU3vPiirBwLbT2kJiAdwLiymwcCkrBdDF1NTRG6kPFA== dependencies: "@react-types/shared" "^3.26.0" -"@react-types/grid@^3.2.10", "@react-types/grid@^3.2.8": +"@react-types/form@^3.7.9": + version "3.7.9" + resolved "https://registry.yarnpkg.com/@react-types/form/-/form-3.7.9.tgz#e2676c7edf66f71f1dfa676ce95e4fc8aab5a049" + integrity sha512-+qGDrQFdIh8umU82zmnYJ0V2rLoGSQ3yApFT02URz//NWeTA7qo0Oab2veKvXUkcBb47oSvytZYmkExPikxIEg== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/grid@^3.2.10": version "3.2.10" resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.10.tgz#d2d1d124ed9472e3dedc48e91c941a7ad23bdc83" integrity sha512-Z5cG0ITwqjUE4kWyU5/7VqiPl4wqMJ7kG/ZP7poAnLmwRsR8Ai0ceVn+qzp5nTA19cgURi8t3LsXn3Ar1FBoog== dependencies: "@react-types/shared" "^3.26.0" +"@react-types/grid@^3.2.11": + version "3.2.11" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.11.tgz#0609807fde54356e3ff99a3b6df5859afed5e517" + integrity sha512-Mww9nrasppvPbsBi+uUqFnf7ya8fXN0cTVzDNG+SveD8mhW+sbtuy+gPtEpnFD2Oyi8qLuObefzt4gdekJX2Yw== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/link@^3.5.10": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.10.tgz#17fa4a543fdeb1c3bdc268664073c597b759a266" + integrity sha512-IM2mbSpB0qP44Jh1Iqpevo7bQdZAr0iDyDi13OhsiUYJeWgPMHzGEnQqdBMkrfQeOTXLtZtUyOYLXE2v39bhzQ== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/link@^3.5.9": version "3.5.9" resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.9.tgz#bf61ff2780581de03920e6e43260844a81a38d2f" @@ -3930,6 +4770,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/listbox@^3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.5.4.tgz#71de93319e508a38a073e5cc9ffcaa01d7fb02e7" + integrity sha512-5otTes0zOwRZwNtqysPD/aW4qFJSxd5znjwoWTLnzDXXOBHXPyR83IJf8ITgvIE5C0y+EFadsWR/BBO3k9Pj7g== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/menu@^3.9.13": version "3.9.13" resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.13.tgz#a666c2233cbdb495202586df86a798601788f74d" @@ -3938,6 +4785,14 @@ "@react-types/overlays" "^3.8.11" "@react-types/shared" "^3.26.0" +"@react-types/menu@^3.9.14": + version "3.9.14" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.14.tgz#524d173ad2d79bf9deeffd7de2af8a9839f9a212" + integrity sha512-RJW/S8IPwbRuohJ/A9HJ7W8QaAY816tm7Nv6+H/TLXG76zu2AS5vEgq+0TcCAWvJJwUdLDpJWJMlo0iIoIBtcg== + dependencies: + "@react-types/overlays" "^3.8.12" + "@react-types/shared" "^3.27.0" + "@react-types/meter@^3.4.5": version "3.4.5" resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.4.5.tgz#e06d4a2fabd24989c73541b032123c5de495b613" @@ -3945,6 +4800,13 @@ dependencies: "@react-types/progress" "^3.5.8" +"@react-types/meter@^3.4.6": + version "3.4.6" + resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.4.6.tgz#c57bfb6b7ab3e34575474332edaa2999c4eeb676" + integrity sha512-YczAht1VXy3s4fR6Dq0ibGsjulGHzS/A/K4tOruSNTL6EkYH9ktHX62Xk/OhCiKHxV315EbZ136WJaCeO4BgHw== + dependencies: + "@react-types/progress" "^3.5.9" + "@react-types/numberfield@^3.8.7": version "3.8.7" resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.8.7.tgz#5a697fdf1bc405dbf55dafed713d47ed79f8e54b" @@ -3952,6 +4814,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/numberfield@^3.8.8": + version "3.8.8" + resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.8.8.tgz#7134dc8e40ebeb493be7badc28648a11b6186f16" + integrity sha512-825JPppxDaWh0Zxb0Q+wSslgRQYOtQPCAuhszPuWEy6d2F/M+hLR+qQqvQm9+LfMbdwiTg6QK5wxdWFCp2t7jw== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/overlays@^3.8.11": version "3.8.11" resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.11.tgz#313964703b2a23572138120b619d35da33445dfd" @@ -3959,6 +4828,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/overlays@^3.8.12": + version "3.8.12" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.12.tgz#0cd1ee17e6eacc33899821ab34045fc396898c22" + integrity sha512-ZvR1t0YV7/6j+6OD8VozKYjvsXT92+C/2LOIKozy7YUNS5KI4MkXbRZzJvkuRECVZOmx8JXKTUzhghWJM/3QuQ== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/progress@^3.5.8": version "3.5.8" resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.8.tgz#62ce4207c7e8d640b794c6d89063ce21bdb5970d" @@ -3966,6 +4842,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/progress@^3.5.9": + version "3.5.9" + resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.9.tgz#aab7a20f361d970e5e847fedbe4306557cde0bad" + integrity sha512-zFxOzx3G8XUmHgpm037Hcayls5bqzXVa182E3iM7YWTmrjxJPKZ58XL0WWBgpTd+mJD7fTpnFdAZqSmFbtDOdA== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/radio@^3.8.5": version "3.8.5" resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.5.tgz#8e2dd1911fba829b7f1ebb40bccf9ca483f021fc" @@ -3973,6 +4856,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/radio@^3.8.6": + version "3.8.6" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.6.tgz#e3721f47fdbcc56a6c912870c0676edb146bc822" + integrity sha512-woTQYdRFjPzuml4qcIf+2zmycRuM5w3fDS5vk6CQmComVUjOFPtD28zX3Z9kc9lSNzaBQz9ONZfFqkZ1gqfICA== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/searchfield@^3.5.10": version "3.5.10" resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.10.tgz#015a42bf8417618b848035b88f0aba98572beceb" @@ -3981,6 +4871,14 @@ "@react-types/shared" "^3.26.0" "@react-types/textfield" "^3.10.0" +"@react-types/searchfield@^3.5.11": + version "3.5.11" + resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.11.tgz#b15872853ef0908c1b0d81fcb40df50e60600f58" + integrity sha512-MX8d9pgvxZxmgDwI0tiDaf6ijOY8XcRj0HM8Ocfttlk7PEFJK44p51WsUC+fPX1GmZni2JpFkx/haPOSLUECdw== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/textfield" "^3.11.0" + "@react-types/select@^3.9.8": version "3.9.8" resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.8.tgz#2443b82549b65821f85876a5b803e6d04ae6343e" @@ -3988,18 +4886,37 @@ dependencies: "@react-types/shared" "^3.26.0" -"@react-types/shared@^3.24.1", "@react-types/shared@^3.26.0": +"@react-types/select@^3.9.9": + version "3.9.9" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.9.tgz#adb771b5152be664e0e3011dad60cc4a3258c66d" + integrity sha512-/hCd0o+ztn29FKCmVec+v7t4JpOzz56o+KrG7NDq2pcRWqUR9kNwCjrPhSbJIIEDm4ubtrfPu41ysIuDvRd2Bg== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/shared@^3.26.0": version "3.26.0" resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.26.0.tgz#21a8b579f0097ee78de18e3e580421ced89e4c8c" integrity sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw== -"@react-types/slider@^3.7.5", "@react-types/slider@^3.7.7": +"@react-types/shared@^3.27.0": + version "3.27.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.27.0.tgz#167c163139efc98c2194aba090076c03b658c07d" + integrity sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw== + +"@react-types/slider@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.7.tgz#f00450c6268665ff2ad38ad69bdf51d84ff2341a" integrity sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g== dependencies: "@react-types/shared" "^3.26.0" +"@react-types/slider@^3.7.8": + version "3.7.8" + resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.8.tgz#a844b81a67171931352d3b5fb40ae87290b99097" + integrity sha512-utW1o9KT70hqFwu1zqMtyEWmP0kSATk4yx+Fm/peSR4iZa+BasRqH83yzir5GKc8OfqfE1kmEsSlO98/k986+w== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/switch@^3.5.7": version "3.5.7" resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.7.tgz#f3fb589fce5819ca1c15f12479bf348e053adc27" @@ -4007,7 +4924,14 @@ dependencies: "@react-types/shared" "^3.26.0" -"@react-types/table@^3.10.1", "@react-types/table@^3.10.3": +"@react-types/switch@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.8.tgz#fd2d2c7fab236d3daaca57cfe34b3ec37cb0fef5" + integrity sha512-sL7jmh8llF8BxzY4HXkSU4bwU8YU6gx45P85D0AdYXgRHxU9Cp7BQPOMF4pJoQ8TTej05MymY5q7xvJVmxUTAQ== + dependencies: + "@react-types/shared" "^3.27.0" + +"@react-types/table@^3.10.3": version "3.10.3" resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.3.tgz#33959348641500e406abe330074f84b0c75ae4ac" integrity sha512-Ac+W+m/zgRzlTU8Z2GEg26HkuJFswF9S6w26r+R3MHwr8z2duGPvv37XRtE1yf3dbpRBgHEAO141xqS2TqGwNg== @@ -4015,6 +4939,14 @@ "@react-types/grid" "^3.2.10" "@react-types/shared" "^3.26.0" +"@react-types/table@^3.10.4": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.4.tgz#1ad302f78625c864bc8fd7fa95d839e50efdec15" + integrity sha512-d0tLz/whxVteqr1rophtuuxqyknHHfTKeXrCgDjt8pAyd9U8GPDbfcFSfYPUhWdELRt7aLVyQw6VblZHioVEgQ== + dependencies: + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@react-types/tabs@^3.3.11": version "3.3.11" resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.11.tgz#b7db710ce2ca42a4e72cd2a581070212d2b07793" @@ -4022,6 +4954,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/tabs@^3.3.12": + version "3.3.12" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.12.tgz#7cd69dae549136ede13f35878e65ccff7bb4522f" + integrity sha512-E9O9G+wf9kaQ8UbDEDliW/oxYlJnh7oDCW1zaMOySwnG4yeCh7Wu02EOCvlQW4xvgn/i+lbEWgirf7L+yj5nRg== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/textfield@^3.10.0": version "3.10.0" resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.10.0.tgz#10df39b75334174490a539ecae71ad19f5ea074d" @@ -4029,6 +4968,13 @@ dependencies: "@react-types/shared" "^3.26.0" +"@react-types/textfield@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.11.0.tgz#09d1fb2dbc24795b22008d27490b1620e6d68c01" + integrity sha512-YORBgr6wlu2xfvr4MqjKFHGpj+z8LBzk14FbWDbYnnhGnv0I10pj+m2KeOHgDNFHrfkDdDOQmMIKn1UCqeUuEg== + dependencies: + "@react-types/shared" "^3.27.0" + "@react-types/tooltip@^3.4.13": version "3.4.13" resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.13.tgz#f73fdc5c56790b7bd7c0d5382d0c758bd659e9d7" @@ -4037,6 +4983,14 @@ "@react-types/overlays" "^3.8.11" "@react-types/shared" "^3.26.0" +"@react-types/tooltip@^3.4.14": + version "3.4.14" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.14.tgz#7acc4247f9bcb30e50fc4c18e8b3fda17e52d85c" + integrity sha512-J7CeYL2yPeKIasx1rPaEefyCHGEx2DOCx+7bM3XcKGmCxvNdVQLjimNJOt8IHlUA0nFJQOjmSW/mz9P0f2/kUw== + dependencies: + "@react-types/overlays" "^3.8.12" + "@react-types/shared" "^3.27.0" + "@remirror/core-constants@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-3.0.0.tgz#96fdb89d25c62e7b6a5d08caf0ce5114370e3b8f" @@ -4119,51 +5073,51 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== -"@sentry-internal/browser-utils@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.47.0.tgz#39f2766a1bbdffc2d211e2f61f8ed8c258245b3d" - integrity sha512-vOXzYzHTKkahTLDzWWIA4EiVCQ+Gk+7xGWUlNcR2ZiEPBqYZVb5MjsUozAcc7syrSUy6WicyFjcomZ3rlCVQhg== +"@sentry-internal/browser-utils@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.52.0.tgz#0028e2ab164ef31fbbc0ef70e11c6e406598d6ea" + integrity sha512-ojFldpRpGrgacIQMbbMZeqLYetNJJ61n+Pz29FpggaIRrbkq84ocoy4FCy+9BuLo6ywgxtUFrjOXD9pPRcZtUA== dependencies: - "@sentry/core" "8.47.0" + "@sentry/core" "8.52.0" -"@sentry-internal/feedback@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.47.0.tgz#22bceac03b61ab8509e79c0875fb140f214b7c4f" - integrity sha512-IAiIemTQIalxAOYhUENs9bZ8pMNgJnX3uQSuY7v0gknEqClOGpGkG04X/cxCmtJUj1acZ9ShTGDxoh55a+ggAQ== +"@sentry-internal/feedback@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.52.0.tgz#fd571d1554e07269056d87c66e56b78bd8d52518" + integrity sha512-r62Ufg4uGlvQsQ+nRSiq9y0ieVFRlZvUaoT/zMjmPuMg29O9rRAMdPJuiCpBH4++x8KJoJ9c2HBRizn6/3uc5Q== dependencies: - "@sentry/core" "8.47.0" + "@sentry/core" "8.52.0" -"@sentry-internal/replay-canvas@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.47.0.tgz#5bbd04c81235b2bf627aa216185ae1993d2102c4" - integrity sha512-M4W9UGouEeELbGbP3QsXLDVtGiQSZoWJlKwqMWyqdQgZuLoKw0S33+60t6teLVMhuQZR0UI9VJTF5coiXysnnA== +"@sentry-internal/replay-canvas@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.52.0.tgz#a7adfd7ba31d41c1cc594ba60e57fc4a1cd07af8" + integrity sha512-4ES2uCUb9yEO1cbg15UBqiYU/syQYj5GviI+TvYvnPX3I8K2mK941ZRqfHh2HpFMhMxLgfX4jDqDGizNhXWdqg== dependencies: - "@sentry-internal/replay" "8.47.0" - "@sentry/core" "8.47.0" + "@sentry-internal/replay" "8.52.0" + "@sentry/core" "8.52.0" -"@sentry-internal/replay@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.47.0.tgz#4f7bd359df2de25d919a378295cab67dfa05a406" - integrity sha512-G/S40ZBORj0HSMLw/uVC6YDEPN/dqVk901vf4VYfml686DEhJrZesfAfp5SydJumQ0NKZQrdtvny+BWnlI5H1w== +"@sentry-internal/replay@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.52.0.tgz#ba0f9fb4b1997a149c6db2544302c060501eb75b" + integrity sha512-b4hQPni1G2tcV5XuAPSV4RTX3vqPXO9RfUXLuTBzOTNzBHDoj8nQv0yVvcysGy5tBAuVRo5ya5A+PG/iC6FA9A== dependencies: - "@sentry-internal/browser-utils" "8.47.0" - "@sentry/core" "8.47.0" + "@sentry-internal/browser-utils" "8.52.0" + "@sentry/core" "8.52.0" "@sentry/babel-plugin-component-annotate@2.22.7": version "2.22.7" resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.7.tgz#604c7e33d48528a13477e7af597c4d5fca51b8bd" integrity sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ== -"@sentry/browser@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.47.0.tgz#fe0b6b65c0394f54438d6704039adeaec214ce18" - integrity sha512-K6BzHisykmbFy/wORtGyfsAlw7ShevLALzu3ReZZZ18dVubO1bjSNjkZQU9MJD5Jcb9oLwkq89n3N9XIBfvdRA== +"@sentry/browser@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.52.0.tgz#fb9238d111deb279db7dcb900833118ab71fd4ee" + integrity sha512-7JpJ9zpInozBzy61eJf/6RPHoKUCFcoFuKd9rttkN1gyY9xkU1cQK+x1f0deiIHnF9ydftmDtXW+kGFI/+xqtw== dependencies: - "@sentry-internal/browser-utils" "8.47.0" - "@sentry-internal/feedback" "8.47.0" - "@sentry-internal/replay" "8.47.0" - "@sentry-internal/replay-canvas" "8.47.0" - "@sentry/core" "8.47.0" + "@sentry-internal/browser-utils" "8.52.0" + "@sentry-internal/feedback" "8.52.0" + "@sentry-internal/replay" "8.52.0" + "@sentry-internal/replay-canvas" "8.52.0" + "@sentry/core" "8.52.0" "@sentry/bundler-plugin-core@2.22.7": version "2.22.7" @@ -4233,35 +5187,35 @@ "@sentry/cli-win32-i686" "2.39.1" "@sentry/cli-win32-x64" "2.39.1" -"@sentry/core@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.47.0.tgz#e811444552f7a91b5de573875a318a6cd4e802f8" - integrity sha512-iSEJZMe3DOcqBFZQAqgA3NB2lCWBc4Gv5x/SCri/TVg96wAlss4VrUunSI2Mp0J4jJ5nJcJ2ChqHSBAU48k3FA== +"@sentry/core@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.52.0.tgz#ad5f4099b82a35b53c16be1fa86fd51817acd051" + integrity sha512-2j3B7IKmseTKFm6AyheJ+RSgXqIsx+3blFSuxpkdvsEt60Lbzva2uDkCENfBDOclioo1kvHgsyuXLfWW4A+wwA== -"@sentry/nextjs@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-8.47.0.tgz#bb050074cc917653f3ac00d5a93820d96a2f0969" - integrity sha512-qr++MBYhyAwF25hGq7LAxe3Xehs+w2V4b8mVxilRYFXNkWFazY1ukZcVzq9pKrrt5uTiURTf68e8eVMraHnHEQ== +"@sentry/nextjs@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-8.52.0.tgz#387195dd3e38f959cf90dba913eec0841ee1504b" + integrity sha512-0tPt780x0XpX0QdedXYuesJ0Caqf8zMk9zAAhA8H6NdA94eJ7ztHwCgX7tOWkzNCnAozcfiC/mMNKIrkmmV0Gg== dependencies: "@opentelemetry/api" "^1.9.0" "@opentelemetry/semantic-conventions" "^1.28.0" "@rollup/plugin-commonjs" "28.0.1" - "@sentry-internal/browser-utils" "8.47.0" - "@sentry/core" "8.47.0" - "@sentry/node" "8.47.0" - "@sentry/opentelemetry" "8.47.0" - "@sentry/react" "8.47.0" - "@sentry/vercel-edge" "8.47.0" + "@sentry-internal/browser-utils" "8.52.0" + "@sentry/core" "8.52.0" + "@sentry/node" "8.52.0" + "@sentry/opentelemetry" "8.52.0" + "@sentry/react" "8.52.0" + "@sentry/vercel-edge" "8.52.0" "@sentry/webpack-plugin" "2.22.7" chalk "3.0.0" resolve "1.22.8" rollup "3.29.5" stacktrace-parser "^0.1.10" -"@sentry/node@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-8.47.0.tgz#52fc68a9f169327cfbf8de0e050111cb96d96689" - integrity sha512-tMzeU3KkmDi2OVvSu+Ah5pwoi7srsSyc1DovBbRQU96RFf/lOFzGe9JERa1MyDUqqLH95NqnPTNsa4Amb8/Vxg== +"@sentry/node@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-8.52.0.tgz#32720d22f4a6496ba3366d06831c2663aedc38f7" + integrity sha512-k+GuWbLDcqIS766zF+TvVRnfbshNy6XKRd+HRNIEaeYa9Tm4LH/ZgCxz39AhFAQGWlZUHm/G2KkCt3AvgswJEg== dependencies: "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.29.0" @@ -4295,43 +5249,43 @@ "@opentelemetry/sdk-trace-base" "^1.29.0" "@opentelemetry/semantic-conventions" "^1.28.0" "@prisma/instrumentation" "5.22.0" - "@sentry/core" "8.47.0" - "@sentry/opentelemetry" "8.47.0" + "@sentry/core" "8.52.0" + "@sentry/opentelemetry" "8.52.0" import-in-the-middle "^1.11.2" -"@sentry/opentelemetry@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-8.47.0.tgz#f62658ef2985ef780a2a1ffc84c06f4d1749d82f" - integrity sha512-wunyBIUPeY6Kx3SFhOQqOPs+hyRADO5bztpo8aZ3N3xfzhefSTOdrgUroKvHx1DvoQO6MAlykcuUFps3yfaqmg== +"@sentry/opentelemetry@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-8.52.0.tgz#ef3276098dbaabdf57d3a06bc7674e5dc192d907" + integrity sha512-NbGPsCZmXQW/B2wlgIjeIn9bCsNKhZGenB0DLK8ZIS/eDOI0JRBjHWMpLS9H9Q0xqgFBjyp+Gwyu3nEZcN4lXw== dependencies: - "@sentry/core" "8.47.0" + "@sentry/core" "8.52.0" -"@sentry/profiling-node@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/profiling-node/-/profiling-node-8.47.0.tgz#6d67dc142b30d3f1fae4fba65dcfd21a1654fe9a" - integrity sha512-YRta5UpsIOs3F/Px0XCWWybouZ62/5I+y/3Qh1u1x0PqBI42CReQTzRPGxwleXonEv5PT+P9WQoYjxRKGQCx9w== +"@sentry/profiling-node@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/profiling-node/-/profiling-node-8.52.0.tgz#efb176305c7028d52e2a9fc65e18290d02b2aae5" + integrity sha512-Omr2VFptPGM/+rMLcuzksTkMrCIXCUL2dHWoqbmA2+IRqX4QxDCzfxGCN7sw6yeQni3GpVyPkSMFc9oa3TiFDA== dependencies: - "@sentry/core" "8.47.0" - "@sentry/node" "8.47.0" + "@sentry/core" "8.52.0" + "@sentry/node" "8.52.0" detect-libc "^2.0.2" node-abi "^3.61.0" -"@sentry/react@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.47.0.tgz#0d9c120b0d4a2efd6d8e8fb9acff332c63afd50d" - integrity sha512-SRk2Up+qBTow4rQGiRXViC2i4M5w/tae5w8I/rmX+IxFoPyh8wXERcLAj/8xbbRm8aR+A4i5gNgfFtrYsyFJFA== +"@sentry/react@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.52.0.tgz#fc04c3fe096bc88702922d46a0392d601ec69669" + integrity sha512-7tbRuTFOgKLM2fM5/TjrfDWbkqOOsxkb2QldnAUHTAcArIx77DpsurAgEx5L9lqn+UAhuw1X2IGbzk9fVV/ZDQ== dependencies: - "@sentry/browser" "8.47.0" - "@sentry/core" "8.47.0" + "@sentry/browser" "8.52.0" + "@sentry/core" "8.52.0" hoist-non-react-statics "^3.3.2" -"@sentry/vercel-edge@8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-8.47.0.tgz#18edc9551d2292d3843870a9aa908b34dea5da85" - integrity sha512-oEVyoFehBnbao1aKd5OagkA5H2zowMsbgRZRPLFHELCSyoJbpShEM6L33rVvDz9xnkcaahuEO8op9U/4pUj1vA== +"@sentry/vercel-edge@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-8.52.0.tgz#9b67d8816f6792485407ec3b79d4e5df44b5c03e" + integrity sha512-6YiAUp4zJeMhVr1hx06c4Ygjzu8b9Kfv/GkmYA0sYPP+wa9shSKdqfD3ROQdWSsI7RtY4qDd22H9/acxchLmlA== dependencies: "@opentelemetry/api" "^1.9.0" - "@sentry/core" "8.47.0" + "@sentry/core" "8.52.0" "@sentry/webpack-plugin@2.22.7": version "2.22.7" @@ -4545,48 +5499,48 @@ dependencies: tslib "^2.8.0" -"@tanstack/eslint-plugin-query@5.62.9": - version "5.62.9" - resolved "https://registry.yarnpkg.com/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.62.9.tgz#cdebcdeddb6399b15f111376b9f0d9353f813384" - integrity sha512-F3onhTcpBj7zQDo0NVtZwZQKRFx8BwpSabMJybl9no3+dFHUurvNMrH5M/6KNpkdDCf3zyHWadruZL6636B8Fw== +"@tanstack/eslint-plugin-query@5.65.0": + version "5.65.0" + resolved "https://registry.yarnpkg.com/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.65.0.tgz#d13dad25c6566a0f99c61b7b8468f57e4add9239" + integrity sha512-UpPtXcAZPHcoEJY8KFcBg/iS99DYGRfYwKo7BwTIJP0lfrdGEL5r2B8YyYERdXBYZfZUQuLgRdU++pD7dltx3g== dependencies: "@typescript-eslint/utils" "^8.18.1" -"@tanstack/query-core@5.62.9": - version "5.62.9" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.62.9.tgz#94231ffea5de086b5e6c0f1e527cda5650cb1849" - integrity sha512-lwePd8hNYhyQ4nM/iRQ+Wz2cDtspGeZZHFZmCzHJ7mfKXt+9S301fULiY2IR2byJYY6Z03T427E5PoVfMexHjw== +"@tanstack/query-core@5.65.0": + version "5.65.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.65.0.tgz#6b7c7087a36867361535b613ff39b633808052fd" + integrity sha512-Bnnq/1axf00r2grRT6gUyIkZRKzhHs+p4DijrCQ3wMlA3D3TTT71gtaSLtqnzGddj73/7X5JDGyjiSLdjvQN4w== -"@tanstack/query-devtools@5.62.9": - version "5.62.9" - resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.62.9.tgz#9bbb8b8ef2c80455add15b873a1d8d6ee6eb462e" - integrity sha512-b1NZzDLVf6laJsB1Cfm3ieuYzM+WqoO8qpm9v+3Etwd+Ph4zkhUMiT+wcWj5AhEPsXiRodKYiiW048VDNdBxNg== +"@tanstack/query-devtools@5.65.0": + version "5.65.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.65.0.tgz#37da5e911543b4f6d98b9a04369eab0de6044ba1" + integrity sha512-g5y7zc07U9D3esMdqUfTEVu9kMHoIaVBsD0+M3LPdAdD710RpTcLiNvJY1JkYXqkq9+NV+CQoemVNpQPBXVsJg== -"@tanstack/react-query-devtools@5.62.11": - version "5.62.11" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.62.11.tgz#0b44246d596788fd4ca87ad32bd7582697df8efa" - integrity sha512-i0vKgdM4ORRzqduz7UeUF52UhLrvRp4sNY/DnLsd5NqNyiKct3a0bLQMWE2fqjF5tEExQ0d0xY60ILXW/T62xA== +"@tanstack/react-query-devtools@5.65.1": + version "5.65.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.65.1.tgz#375ba44398076436f9c82f5ae46f0a3d47397db6" + integrity sha512-PKUBz7+FAP3eI1zoWrP5vxNQXs+elPz3u/3cILGhNZl2dufgbU9OJRpbC+BAptLXTsGxTwkAlrWBIZbD/c7CDw== dependencies: - "@tanstack/query-devtools" "5.62.9" + "@tanstack/query-devtools" "5.65.0" -"@tanstack/react-query@5.62.11": - version "5.62.11" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.62.11.tgz#95a615a60dc8fd836a5085dea2739a62f4953f55" - integrity sha512-Xb1nw0cYMdtFmwkvH9+y5yYFhXvLRCnXoqlzSw7UkqtCVFq3cG8q+rHZ2Yz1XrC+/ysUaTqbLKJqk95mCgC1oQ== +"@tanstack/react-query@5.65.1": + version "5.65.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.65.1.tgz#84f120f7cf7398626c991ccef4557bd4d780fe37" + integrity sha512-BSpjo4RQdJ75Mw3pqM1AJYNhanNxJE3ct7RmCZUAv9cUJg/Qmonzc/Xy2kKXeQA1InuKATSuc6pOZciWOF8TYQ== dependencies: - "@tanstack/query-core" "5.62.9" + "@tanstack/query-core" "5.65.0" -"@tanstack/react-table@8.20.1": - version "8.20.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.20.1.tgz#bd2d549d8a18458fb8284025ce66a9b86176fa6b" - integrity sha512-PJK+07qbengObe5l7c8vCdtefXm8cyR4i078acWrHbdm8JKw1ES7YpmOtVt9ALUVEEFAHscdVpGRhRgikgFMbQ== +"@tanstack/react-table@8.20.6": + version "8.20.6" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.20.6.tgz#a1f3103327aa59aa621931f4087a7604a21054d0" + integrity sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ== dependencies: - "@tanstack/table-core" "8.20.1" + "@tanstack/table-core" "8.20.5" -"@tanstack/table-core@8.20.1": - version "8.20.1" - resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.1.tgz#74bfab10fa35bed51fa0bd2f3539a331d7e78f1b" - integrity sha512-5Ly5TIRHnWH7vSDell9B/OVyV380qqIJVg7H7R7jU4fPEmOD4smqAX7VRflpYI09srWR8aj5OLD2Ccs1pI5mTg== +"@tanstack/table-core@8.20.5": + version "8.20.5" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.5.tgz#3974f0b090bed11243d4107283824167a395cf1d" + integrity sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg== "@testing-library/dom@10.4.0": version "10.4.0" @@ -4615,17 +5569,17 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react@16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.1.0.tgz#aa0c61398bac82eaf89776967e97de41ac742d71" - integrity sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg== +"@testing-library/react@16.2.0": + version "16.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.2.0.tgz#c96126ee01a49cdb47175721911b4a9432afc601" + integrity sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ== dependencies: "@babel/runtime" "^7.12.5" -"@testing-library/user-event@14.5.2": - version "14.5.2" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" - integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== +"@testing-library/user-event@14.6.1": + version "14.6.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" + integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== "@tiptap/core@^2.7.1": version "2.11.0" @@ -5014,10 +5968,10 @@ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== -"@types/lodash@4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" - integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== +"@types/lodash@4.17.15": + version "4.17.15" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.15.tgz#12d4af0ed17cc7600ce1f9980cec48fc17ad1e89" + integrity sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw== "@types/luxon@3.4.2": version "3.4.2" @@ -5078,10 +6032,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@22.10.3", "@types/node@^22.7.5": - version "22.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.3.tgz#cdc2a89bf6e5d5e593fad08e83f74d7348d5dd10" - integrity sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw== +"@types/node@*", "@types/node@22.12.0", "@types/node@^22.7.5": + version "22.12.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.12.0.tgz#bf8af3b2af0837b5a62a368756ff2b705ae0048c" + integrity sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA== dependencies: undici-types "~6.20.0" @@ -5125,11 +6079,6 @@ pg-protocol "*" pg-types "^2.2.0" -"@types/prop-types@*": - version "15.7.14" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" - integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== - "@types/qs@*": version "6.9.17" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" @@ -5140,12 +6089,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@18.3.1": - version "18.3.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" - integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== - dependencies: - "@types/react" "*" +"@types/react-dom@*", "@types/react-dom@19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.0.3.tgz#0804dfd279a165d5a0ad8b53a5b9e65f338050a4" + integrity sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA== "@types/react-modal@3.16.3": version "3.16.3" @@ -5166,12 +6113,11 @@ dependencies: csstype "^3.0.2" -"@types/react@18.3.12": - version "18.3.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" - integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== +"@types/react@19.0.8": + version "19.0.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" + integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== dependencies: - "@types/prop-types" "*" csstype "^3.0.2" "@types/resolve@1.20.2": @@ -5266,13 +6212,20 @@ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== -"@types/ws@*", "@types/ws@8.5.13": +"@types/ws@*": version "8.5.13" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" +"@types/ws@8.5.14": + version "8.5.14" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" + integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -5285,30 +6238,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@*", "@typescript-eslint/eslint-plugin@8.19.0", "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz#2b1e1b791e21d5fc27ddc93884db066444f597b5" - integrity sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q== +"@typescript-eslint/eslint-plugin@*", "@typescript-eslint/eslint-plugin@8.22.0", "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz#63a1b0d24d85a971949f8d71d693019f58d2e861" + integrity sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.19.0" - "@typescript-eslint/type-utils" "8.19.0" - "@typescript-eslint/utils" "8.19.0" - "@typescript-eslint/visitor-keys" "8.19.0" + "@typescript-eslint/scope-manager" "8.22.0" + "@typescript-eslint/type-utils" "8.22.0" + "@typescript-eslint/utils" "8.22.0" + "@typescript-eslint/visitor-keys" "8.22.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" - ts-api-utils "^1.3.0" + ts-api-utils "^2.0.0" -"@typescript-eslint/parser@*", "@typescript-eslint/parser@8.19.0", "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.19.0.tgz#f1512e6e5c491b03aabb2718b95becde22b15292" - integrity sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw== +"@typescript-eslint/parser@*", "@typescript-eslint/parser@8.22.0", "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.22.0.tgz#f21c5db24271f182ebbb4ba8c7ad3eb76e5f5f3a" + integrity sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ== dependencies: - "@typescript-eslint/scope-manager" "8.19.0" - "@typescript-eslint/types" "8.19.0" - "@typescript-eslint/typescript-estree" "8.19.0" - "@typescript-eslint/visitor-keys" "8.19.0" + "@typescript-eslint/scope-manager" "8.22.0" + "@typescript-eslint/types" "8.22.0" + "@typescript-eslint/typescript-estree" "8.22.0" + "@typescript-eslint/visitor-keys" "8.22.0" debug "^4.3.4" "@typescript-eslint/scope-manager@8.19.0", "@typescript-eslint/scope-manager@^8.15.0": @@ -5319,21 +6272,34 @@ "@typescript-eslint/types" "8.19.0" "@typescript-eslint/visitor-keys" "8.19.0" -"@typescript-eslint/type-utils@8.19.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz#41abd7d2e4cf93b6854b1fe6cbf416fab5abf89f" - integrity sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg== +"@typescript-eslint/scope-manager@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz#e85836ddeb8eae715f870628bcc32fe96aaf4d0e" + integrity sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ== dependencies: - "@typescript-eslint/typescript-estree" "8.19.0" - "@typescript-eslint/utils" "8.19.0" + "@typescript-eslint/types" "8.22.0" + "@typescript-eslint/visitor-keys" "8.22.0" + +"@typescript-eslint/type-utils@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz#cd9f23c23f021357ef0baa3490d4d96edcc97509" + integrity sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA== + dependencies: + "@typescript-eslint/typescript-estree" "8.22.0" + "@typescript-eslint/utils" "8.22.0" debug "^4.3.4" - ts-api-utils "^1.3.0" + ts-api-utils "^2.0.0" "@typescript-eslint/types@8.19.0": version "8.19.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.19.0.tgz#a190a25c5484a42b81eaad06989579fdeb478cbb" integrity sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA== +"@typescript-eslint/types@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.22.0.tgz#d9dec7116479ad03aeb6c8ac9c5223c4c79cf360" + integrity sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A== + "@typescript-eslint/typescript-estree@8.19.0": version "8.19.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz#6b4f48f98ffad6597379951b115710f4d68c9ccb" @@ -5348,7 +6314,31 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.19.0", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.15.0", "@typescript-eslint/utils@^8.18.1": +"@typescript-eslint/typescript-estree@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz#c188c3e19529d5b3145577c0bd967e2683b114df" + integrity sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w== + dependencies: + "@typescript-eslint/types" "8.22.0" + "@typescript-eslint/visitor-keys" "8.22.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.0" + +"@typescript-eslint/utils@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.22.0.tgz#c8cc4e52a9c711af8a741a82dc5d7242b7a8dd44" + integrity sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.22.0" + "@typescript-eslint/types" "8.22.0" + "@typescript-eslint/typescript-estree" "8.22.0" + +"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.15.0", "@typescript-eslint/utils@^8.18.1": version "8.19.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.19.0.tgz#33824310e1fccc17f27fbd1030fd8bbd9a674684" integrity sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg== @@ -5366,6 +6356,14 @@ "@typescript-eslint/types" "8.19.0" eslint-visitor-keys "^4.2.0" +"@typescript-eslint/visitor-keys@8.22.0": + version "8.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz#02cc005014c372033eb9171e2275b76cba722a3f" + integrity sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w== + dependencies: + "@typescript-eslint/types" "8.22.0" + eslint-visitor-keys "^4.2.0" + "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" @@ -6111,6 +7109,14 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacheable@^1.8.8: + version "1.8.8" + resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-1.8.8.tgz#d105f6de41811e42acfa1327718f955794f879a6" + integrity sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw== + dependencies: + hookified "^1.7.0" + keyv "^5.2.3" + call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" @@ -6247,10 +7253,10 @@ chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chromatic@11.7.1: - version "11.7.1" - resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.7.1.tgz#9de59dd9d0e2a847627bccd959f05881335b524e" - integrity sha512-LvgPimdQdnQB07ZDxLEC2KtxgYeqTw0X71GA7fi3zhgtKLxZcE+BSZ/5I9rrQp1V8ydmfElfw0ZwnUH4fVgUAQ== +chromatic@11.22.0: + version "11.22.0" + resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.22.0.tgz#9c2b05a0c5a94c5c0cc2b6be6969c112ac4543d0" + integrity sha512-u1kAPR9lj9aFzsCp0iWPXBbsKgcxFU7iJO6mFbgNHGVg+YPBqiJMuvgB8EQHdNbHjk5amFnGnIz/Ww8fK3t9Hw== chrome-trace-event@^1.0.2: version "1.0.4" @@ -6613,7 +7619,7 @@ css-tree@^2.3.1: mdn-data "2.0.30" source-map-js "^1.0.1" -css-tree@^3.0.1: +css-tree@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== @@ -6886,19 +7892,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -docx@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/docx/-/docx-9.1.0.tgz#e089b86048df0fb777f0a957bc45c7a591b181f8" - integrity sha512-XOtseSTRrkKN/sV5jNBqyLazyhNpWfaUhpuKc22cs+5DavNjRQvchnohb0g0S+x/96/D06U/i0/U/Gc4E5kwuQ== - dependencies: - "@types/node" "^22.7.5" - hash.js "^1.1.7" - jszip "^3.10.1" - nanoid "^5.0.4" - xml "^1.0.1" - xml-js "^1.6.8" - -docx@^9.0.2: +docx@9.1.1, docx@^9.0.2: version "9.1.1" resolved "https://registry.yarnpkg.com/docx/-/docx-9.1.1.tgz#0c72d8000e9bb5bb380c5b48656a3277eb53322d" integrity sha512-jz941pdz4+gMljZ1pV+95FwuWEouKi4u1Elhv3ptqeytGOSyX+u131hRYg4wgqLU+x2CbGsz9eTYgo2uMMz65Q== @@ -7290,12 +8284,12 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-next@15.1.3: - version "15.1.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.1.3.tgz#7656b47591745bcdbd60d396282924d89f82eea6" - integrity sha512-wGYlNuWnh4ujuKtZvH+7B2Z2vy9nONZE6ztd+DKF7hAsIabkrxmD4TzYHzASHENo42lmz2tnT2B+zN2sOHvpJg== +eslint-config-next@15.1.6: + version "15.1.6" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.1.6.tgz#c056b7325dc70a247895c7c85515ebaae2bab35d" + integrity sha512-Wd1uy6y7nBbXUSg9QAuQ+xYEKli5CgUhLjz1QHW11jLDis5vK5XB3PemL6jEmy7HrdhaRFDz+GTZ/3FoH+EUjg== dependencies: - "@next/eslint-plugin-next" "15.1.3" + "@next/eslint-plugin-next" "15.1.6" "@rushstack/eslint-patch" "^1.10.3" "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -7306,10 +8300,10 @@ eslint-config-next@15.1.3: eslint-plugin-react "^7.37.0" eslint-plugin-react-hooks "^5.0.0" -eslint-config-prettier@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== +eslint-config-prettier@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz#fbb03bfc8db0651df9ce4e8b7150d11c5fe3addf" + integrity sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw== eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -7366,10 +8360,10 @@ eslint-plugin-import@2.31.0, eslint-plugin-import@^2.31.0: string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" -eslint-plugin-jest@28.10.0: - version "28.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz#4b35b8abb0f7cfe699bff8d9060270a2ddd770ea" - integrity sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA== +eslint-plugin-jest@28.11.0: + version "28.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz#2641ecb4411941bbddb3d7cf8a8ff1163fbb510e" + integrity sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig== dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -7394,17 +8388,17 @@ eslint-plugin-jsx-a11y@6.10.2, eslint-plugin-jsx-a11y@^6.10.0: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" -eslint-plugin-playwright@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-2.1.0.tgz#9d84b5d839226e1f9ac926663baee29d103dcc99" - integrity sha512-wMbHOehofSB1cBdzz2CLaCYaKNLeTQ0YnOW+7AHa281TJqlpEJUBgTHbRUYOUxiXphfWwOyTPvgr6vvEmArbSA== +eslint-plugin-playwright@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz#d7eda21e670274fc0c006e11ba5cc2c8417b2a6e" + integrity sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg== dependencies: globals "^13.23.0" -eslint-plugin-prettier@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" - integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== +eslint-plugin-prettier@5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" + integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== dependencies: prettier-linter-helpers "^1.0.0" synckit "^0.9.1" @@ -7414,7 +8408,31 @@ eslint-plugin-react-hooks@^5.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== -eslint-plugin-react@7.37.3, eslint-plugin-react@^7.37.0: +eslint-plugin-react@7.37.4: + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-plugin-react@^7.37.0: version "7.37.3" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== @@ -7690,7 +8708,7 @@ fast-glob@3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -7701,6 +8719,17 @@ fast-glob@^3.2.9, fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.2, fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -7771,6 +8800,13 @@ figlet@1.7.0: resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== +file-entry-cache@^10.0.5: + version "10.0.6" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.0.6.tgz#1fc49c38231b56e792c65222c0aa519d40b5db55" + integrity sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA== + dependencies: + flat-cache "^6.1.6" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -7778,13 +8814,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-entry-cache@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.1.0.tgz#2e66ad98ce93f49aed1b178c57b0b5741591e075" - integrity sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg== - dependencies: - flat-cache "^5.0.0" - filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -7842,15 +8871,16 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flat-cache@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" - integrity sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ== +flat-cache@^6.1.6: + version "6.1.6" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.6.tgz#62a94ba475297ec742d6c3a2be6516a96d311c9e" + integrity sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ== dependencies: - flatted "^3.3.1" - keyv "^4.5.4" + cacheable "^1.8.8" + flatted "^3.3.2" + hookified "^1.7.0" -flatted@^3.2.9, flatted@^3.3.1: +flatted@^3.2.9, flatted@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== @@ -8537,6 +9567,11 @@ hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" +hookified@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.7.0.tgz#d1eb2a1d099fd4eeb3c43e5f75f3fe2ae82aae13" + integrity sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA== + hsl-to-hex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz#c58c826dc6d2f1e0a5ff1da5a7ecbf03faac1352" @@ -8689,7 +9724,14 @@ i18next-parser@9.1.0: vinyl "^3.0.0" vinyl-fs "^4.0.0" -i18next@24.2.0, "i18next@^23.5.1 || ^24.2.0": +i18next@24.2.2: + version "24.2.2" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.2.tgz#3ba3d213302068d569142737f03f30929de696de" + integrity sha512-NE6i86lBCKRYZa5TaUDkU5S4HFgLIEJRLr3Whf2psgaxBleQ2LC1YW1Vc+SCgkAW7VEzndT6al6+CzegSUHcTQ== + dependencies: + "@babel/runtime" "^7.23.2" + +"i18next@^23.5.1 || ^24.2.0": version "24.2.0" resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.0.tgz#344c15a6f3b43d02aed78e2b08532e5b170951b4" integrity sha512-ArJJTS1lV6lgKH7yEf4EpgNZ7+THl7bsGxxougPYiXRTJ/Fe1j08/TBpV9QsXCIYVfdE/HWG/xLezJ5DOlfBOA== @@ -8735,10 +9777,10 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" - integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== +ignore@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" + integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== immediate@~3.0.5: version "3.0.6" @@ -9754,13 +10796,20 @@ jszip@^3.10.1: readable-stream "~2.3.6" setimmediate "^1.0.5" -keyv@^4.5.3, keyv@^4.5.4: +keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" +keyv@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.2.3.tgz#32db1a4aa8d05e2b8ab82688a57ddc5d2184a25c" + integrity sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw== + dependencies: + "@keyv/serialize" "^1.0.2" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -9811,7 +10860,7 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lib0@^0.2.42, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87, lib0@^0.2.98: +lib0@^0.2.42, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87, lib0@^0.2.98, lib0@^0.2.99: version "0.2.99" resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.99.tgz#80d715dbd75496dabe0a1f5061fbb4ea162d2532" integrity sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w== @@ -9906,7 +10955,7 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -10653,7 +11702,7 @@ mylas@^2.1.9: resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.6, nanoid@^3.3.7, nanoid@^3.3.8: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -10678,12 +11727,12 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next@15.1.3: - version "15.1.3" - resolved "https://registry.yarnpkg.com/next/-/next-15.1.3.tgz#49c45f884660dfaf07f53e70585d109a3283100e" - integrity sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA== +next@15.1.6: + version "15.1.6" + resolved "https://registry.yarnpkg.com/next/-/next-15.1.6.tgz#ce22fd0a8f36da1fc4aba86e3ec7e98eb248c555" + integrity sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q== dependencies: - "@next/env" "15.1.3" + "@next/env" "15.1.6" "@swc/counter" "0.1.3" "@swc/helpers" "0.5.15" busboy "1.6.0" @@ -10691,14 +11740,14 @@ next@15.1.3: postcss "8.4.31" styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "15.1.3" - "@next/swc-darwin-x64" "15.1.3" - "@next/swc-linux-arm64-gnu" "15.1.3" - "@next/swc-linux-arm64-musl" "15.1.3" - "@next/swc-linux-x64-gnu" "15.1.3" - "@next/swc-linux-x64-musl" "15.1.3" - "@next/swc-win32-arm64-msvc" "15.1.3" - "@next/swc-win32-x64-msvc" "15.1.3" + "@next/swc-darwin-arm64" "15.1.6" + "@next/swc-darwin-x64" "15.1.6" + "@next/swc-linux-arm64-gnu" "15.1.6" + "@next/swc-linux-arm64-musl" "15.1.6" + "@next/swc-linux-x64-gnu" "15.1.6" + "@next/swc-linux-x64-musl" "15.1.6" + "@next/swc-win32-arm64-msvc" "15.1.6" + "@next/swc-win32-x64-msvc" "15.1.6" sharp "^0.33.5" no-case@^3.0.4: @@ -11137,17 +12186,17 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -playwright-core@1.49.1: - version "1.49.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015" - integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== +playwright-core@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.50.0.tgz#28dd6a1488211c193933695ed337a5b44d46867c" + integrity sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ== -playwright@1.49.1: - version "1.49.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.49.1.tgz#830266dbca3008022afa7b4783565db9944ded7c" - integrity sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA== +playwright@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.50.0.tgz#ccaf334f948d78139922844de55a18f8ae785410" + integrity sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w== dependencies: - playwright-core "1.49.1" + playwright-core "1.50.0" optionalDependencies: fsevents "2.3.2" @@ -11204,12 +12253,12 @@ postcss@8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -postcss@^8.4.49: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== +postcss@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== dependencies: - nanoid "^3.3.7" + nanoid "^3.3.8" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -11262,10 +12311,10 @@ postgres-range@^1.1.1: resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.4.tgz#a59c5f9520909bcec5e63e8cf913a92e4c952863" integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== -posthog-js@1.204.0: - version "1.204.0" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.204.0.tgz#73843af471fcc484ca1e8e1bcc927887cf81b4ba" - integrity sha512-wVt948wKPPztCZ3OeDq8y0dtaPbhbY8vFuEVBUNHOn7PohbTXr7HZ4CNhH8fXgFkx5COEzz/20wWJmEsSU5oCA== +posthog-js@1.211.3: + version "1.211.3" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.211.3.tgz#fc02078ae0eda46898afb3ad0e7bc221297e3849" + integrity sha512-QDAHMSyj0LKlrOhFNrHIlbuI1gL6zB5zyix22EtlAjj9d+FlvNRsOOpC9rjPydd6mQw4EHPtj74usma/nE7wNw== dependencies: core-js "^3.38.1" fflate "^0.4.8" @@ -11630,40 +12679,6 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-aria-components@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.3.2.tgz#dee58665210330ec12843e6393ef5cc28ff9a9da" - integrity sha512-jAHR18ubLi4R6mUgSVpPfPGNNfwrveJ7IZ9ns8prUkXpY/A8IkR5x8y1SbXJKq9uwlGC2cEiWjG6OMAsmAAXdQ== - dependencies: - "@internationalized/date" "^3.5.5" - "@internationalized/string" "^3.2.3" - "@react-aria/collections" "3.0.0-alpha.4" - "@react-aria/color" "3.0.0-rc.2" - "@react-aria/dnd" "^3.7.2" - "@react-aria/focus" "^3.18.2" - "@react-aria/interactions" "^3.22.2" - "@react-aria/menu" "^3.15.2" - "@react-aria/toolbar" "3.0.0-beta.8" - "@react-aria/tree" "3.0.0-alpha.4" - "@react-aria/utils" "^3.25.2" - "@react-aria/virtualizer" "^4.0.2" - "@react-stately/color" "^3.7.2" - "@react-stately/layout" "^4.0.2" - "@react-stately/menu" "^3.8.2" - "@react-stately/table" "^3.12.2" - "@react-stately/utils" "^3.10.3" - "@react-stately/virtualizer" "^4.0.2" - "@react-types/color" "3.0.0-rc.1" - "@react-types/form" "^3.7.6" - "@react-types/grid" "^3.2.8" - "@react-types/shared" "^3.24.1" - "@react-types/table" "^3.10.1" - "@swc/helpers" "^0.5.0" - client-only "^0.0.1" - react-aria "^3.34.2" - react-stately "^3.32.2" - use-sync-external-store "^1.2.0" - react-aria-components@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.5.0.tgz#9c51ba8427e827d1192f965249e16ff7d34cbb55" @@ -11702,50 +12717,47 @@ react-aria-components@1.5.0: react-stately "^3.34.0" use-sync-external-store "^1.2.0" -react-aria@3.34.2: - version "3.34.2" - resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.34.2.tgz#7d00dd445d2bedcc4d68aea9aa5ecffe04066aa3" - integrity sha512-V5xvIw/nW6ED8mEdNIao7+z8gKMSff0HAiU7mshh1ZDI0LGyOM6JR/qQmux0mUOxbBARtNiBbBV6pwmQGkfQDw== +react-aria-components@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.6.0.tgz#7a796747539b2b2c62567285da60c63775a9d9fd" + integrity sha512-YfG9PUE7XrXtDDAqT4pLTGyYQaiHHTBFdAK/wNgGsypVnQSdzmyYlV3Ty8aHlZJI6hP9RWkbywvosXkU7KcPHg== dependencies: - "@internationalized/string" "^3.2.3" - "@react-aria/breadcrumbs" "^3.5.16" - "@react-aria/button" "^3.9.8" - "@react-aria/calendar" "^3.5.11" - "@react-aria/checkbox" "^3.14.6" - "@react-aria/combobox" "^3.10.2" - "@react-aria/datepicker" "^3.11.2" - "@react-aria/dialog" "^3.5.17" - "@react-aria/dnd" "^3.7.2" - "@react-aria/focus" "^3.18.2" - "@react-aria/gridlist" "^3.9.2" - "@react-aria/i18n" "^3.12.2" - "@react-aria/interactions" "^3.22.2" - "@react-aria/label" "^3.7.11" - "@react-aria/link" "^3.7.4" - "@react-aria/listbox" "^3.13.2" - "@react-aria/menu" "^3.15.2" - "@react-aria/meter" "^3.4.16" - "@react-aria/numberfield" "^3.11.6" - "@react-aria/overlays" "^3.23.2" - "@react-aria/progress" "^3.4.16" - "@react-aria/radio" "^3.10.7" - "@react-aria/searchfield" "^3.7.8" - "@react-aria/select" "^3.14.8" - "@react-aria/selection" "^3.19.2" - "@react-aria/separator" "^3.4.2" - "@react-aria/slider" "^3.7.11" - "@react-aria/ssr" "^3.9.5" - "@react-aria/switch" "^3.6.7" - "@react-aria/table" "^3.15.2" - "@react-aria/tabs" "^3.9.4" - "@react-aria/tag" "^3.4.4" - "@react-aria/textfield" "^3.14.8" - "@react-aria/tooltip" "^3.7.7" - "@react-aria/utils" "^3.25.2" - "@react-aria/visually-hidden" "^3.8.15" - "@react-types/shared" "^3.24.1" + "@internationalized/date" "^3.7.0" + "@internationalized/string" "^3.2.5" + "@react-aria/autocomplete" "3.0.0-alpha.37" + "@react-aria/collections" "3.0.0-alpha.7" + "@react-aria/color" "^3.0.3" + "@react-aria/disclosure" "^3.0.1" + "@react-aria/dnd" "^3.8.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/interactions" "^3.23.0" + "@react-aria/live-announcer" "^3.4.1" + "@react-aria/menu" "^3.17.0" + "@react-aria/toolbar" "3.0.0-beta.12" + "@react-aria/tree" "3.0.0-beta.3" + "@react-aria/utils" "^3.27.0" + "@react-aria/virtualizer" "^4.1.1" + "@react-stately/autocomplete" "3.0.0-alpha.0" + "@react-stately/color" "^3.8.2" + "@react-stately/disclosure" "^3.0.1" + "@react-stately/layout" "^4.1.1" + "@react-stately/menu" "^3.9.1" + "@react-stately/selection" "^3.19.0" + "@react-stately/table" "^3.13.1" + "@react-stately/utils" "^3.10.5" + "@react-stately/virtualizer" "^4.2.1" + "@react-types/color" "^3.0.2" + "@react-types/form" "^3.7.9" + "@react-types/grid" "^3.2.11" + "@react-types/shared" "^3.27.0" + "@react-types/table" "^3.10.4" + "@swc/helpers" "^0.5.0" + client-only "^0.0.1" + react-aria "^3.37.0" + react-stately "^3.35.0" + use-sync-external-store "^1.2.0" -react-aria@^3.34.2, react-aria@^3.36.0: +react-aria@3.36.0, react-aria@^3.36.0: version "3.36.0" resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.36.0.tgz#95a8e3340ab400bfec4d159e47da8861469e5bcd" integrity sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw== @@ -11790,13 +12802,57 @@ react-aria@^3.34.2, react-aria@^3.36.0: "@react-aria/visually-hidden" "^3.8.18" "@react-types/shared" "^3.26.0" -react-dom@*, react-dom@18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +react-aria@^3.37.0: + version "3.37.0" + resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.37.0.tgz#c561d605b19fe89e4056f98990486d17a56c5352" + integrity sha512-u3WUEMTcbQFaoHauHO3KhPaBYzEv1o42EdPcLAs05GBw9Q6Axlqwo73UFgMrsc2ElwLAZ4EKpSdWHLo1R5gfiw== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" + "@internationalized/string" "^3.2.5" + "@react-aria/breadcrumbs" "^3.5.20" + "@react-aria/button" "^3.11.1" + "@react-aria/calendar" "^3.7.0" + "@react-aria/checkbox" "^3.15.1" + "@react-aria/color" "^3.0.3" + "@react-aria/combobox" "^3.11.1" + "@react-aria/datepicker" "^3.13.0" + "@react-aria/dialog" "^3.5.21" + "@react-aria/disclosure" "^3.0.1" + "@react-aria/dnd" "^3.8.1" + "@react-aria/focus" "^3.19.1" + "@react-aria/gridlist" "^3.10.1" + "@react-aria/i18n" "^3.12.5" + "@react-aria/interactions" "^3.23.0" + "@react-aria/label" "^3.7.14" + "@react-aria/link" "^3.7.8" + "@react-aria/listbox" "^3.14.0" + "@react-aria/menu" "^3.17.0" + "@react-aria/meter" "^3.4.19" + "@react-aria/numberfield" "^3.11.10" + "@react-aria/overlays" "^3.25.0" + "@react-aria/progress" "^3.4.19" + "@react-aria/radio" "^3.10.11" + "@react-aria/searchfield" "^3.8.0" + "@react-aria/select" "^3.15.1" + "@react-aria/selection" "^3.22.0" + "@react-aria/separator" "^3.4.5" + "@react-aria/slider" "^3.7.15" + "@react-aria/ssr" "^3.9.7" + "@react-aria/switch" "^3.6.11" + "@react-aria/table" "^3.16.1" + "@react-aria/tabs" "^3.9.9" + "@react-aria/tag" "^3.4.9" + "@react-aria/textfield" "^3.16.0" + "@react-aria/tooltip" "^3.7.11" + "@react-aria/utils" "^3.27.0" + "@react-aria/visually-hidden" "^3.8.19" + "@react-types/shared" "^3.27.0" + +react-dom@*, react-dom@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" + integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== + dependencies: + scheduler "^0.25.0" react-i18next@15.4.0: version "15.4.0" @@ -11811,10 +12867,10 @@ react-icons@^5.2.1: resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.4.0.tgz#443000f6e5123ee1b21ea8c0a716f6e7797f7416" integrity sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ== -react-intersection-observer@9.13.1: - version "9.13.1" - resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz#6c61a75801162491c6348bad09967f2caf445584" - integrity sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw== +react-intersection-observer@9.15.1: + version "9.15.1" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.15.1.tgz#5866b6fdfef24be9f288b74b35b773f63d90c3eb" + integrity sha512-vGrqYEVWXfH+AGu241uzfUpNK4HAdhCkSAyFdkMb9VWWXs6mxzBLpWCxEy9YcnDNY2g9eO6z7qUtTBdA9hc8pA== react-is@18.2.0: version "18.2.0" @@ -11841,10 +12897,10 @@ react-lifecycles-compat@^3.0.0: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-modal@3.16.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" - integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== +react-modal@3.16.3: + version "3.16.3" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.3.tgz#c412d41915782e3c261253435d01468e2439b11b" + integrity sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw== dependencies: exenv "^1.2.0" prop-types "^15.7.2" @@ -11875,10 +12931,10 @@ react-remove-scroll@^2.6.0, react-remove-scroll@^2.6.1: use-callback-ref "^1.3.3" use-sidecar "^1.1.2" -react-select@5.9.0: - version "5.9.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.9.0.tgz#41325b7bfe8452a8d401b82fc4fb7d44a03e29c5" - integrity sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw== +react-select@5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.10.0.tgz#9b5f4544cfecdfc744184b87651468ee0fb6e172" + integrity sha512-k96gw+i6N3ExgDwPIg0lUPmexl1ygPe6u5BdQFNBhkpbwroIgCNXdubtIzHfThYXYYTubwOBafoMnn7ruEP1xA== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -11890,36 +12946,7 @@ react-select@5.9.0: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.2.0" -react-stately@3.32.2: - version "3.32.2" - resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.32.2.tgz#72f2cdb890327f62738388a7d311ed356bfde41d" - integrity sha512-pDSrbCIJtir4HeSa//PTqLSR7Tl7pFC9usmkkBObNKktObQq3Vdgkf46cxeTD1ov7J7GDdR3meIyjXGnZoEzUg== - dependencies: - "@react-stately/calendar" "^3.5.4" - "@react-stately/checkbox" "^3.6.8" - "@react-stately/collections" "^3.10.9" - "@react-stately/combobox" "^3.9.2" - "@react-stately/data" "^3.11.6" - "@react-stately/datepicker" "^3.10.2" - "@react-stately/dnd" "^3.4.2" - "@react-stately/form" "^3.0.5" - "@react-stately/list" "^3.10.8" - "@react-stately/menu" "^3.8.2" - "@react-stately/numberfield" "^3.9.6" - "@react-stately/overlays" "^3.6.10" - "@react-stately/radio" "^3.10.7" - "@react-stately/searchfield" "^3.5.6" - "@react-stately/select" "^3.6.7" - "@react-stately/selection" "^3.16.2" - "@react-stately/slider" "^3.5.7" - "@react-stately/table" "^3.12.2" - "@react-stately/tabs" "^3.6.9" - "@react-stately/toggle" "^3.7.7" - "@react-stately/tooltip" "^3.4.12" - "@react-stately/tree" "^3.8.4" - "@react-types/shared" "^3.24.1" - -react-stately@^3.32.2, react-stately@^3.34.0: +react-stately@3.34.0, react-stately@^3.34.0: version "3.34.0" resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.34.0.tgz#981713fa00bb2ef07b981dbce466d9a5774101d4" integrity sha512-0N9tZ8qQ/CxpJH7ao0O6gr+8955e7VrOskg9N+TIxkFknPetwOCtgppMYhnTfteBV8WfM/vv4OC1NbkgYTqXJA== @@ -11950,6 +12977,37 @@ react-stately@^3.32.2, react-stately@^3.34.0: "@react-stately/tree" "^3.8.6" "@react-types/shared" "^3.26.0" +react-stately@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.35.0.tgz#92bfc83bb4f7626a57c6aeabe4d08aeaab1fa2f7" + integrity sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA== + dependencies: + "@react-stately/calendar" "^3.7.0" + "@react-stately/checkbox" "^3.6.11" + "@react-stately/collections" "^3.12.1" + "@react-stately/color" "^3.8.2" + "@react-stately/combobox" "^3.10.2" + "@react-stately/data" "^3.12.1" + "@react-stately/datepicker" "^3.12.0" + "@react-stately/disclosure" "^3.0.1" + "@react-stately/dnd" "^3.5.1" + "@react-stately/form" "^3.1.1" + "@react-stately/list" "^3.11.2" + "@react-stately/menu" "^3.9.1" + "@react-stately/numberfield" "^3.9.9" + "@react-stately/overlays" "^3.6.13" + "@react-stately/radio" "^3.10.10" + "@react-stately/searchfield" "^3.5.9" + "@react-stately/select" "^3.6.10" + "@react-stately/selection" "^3.19.0" + "@react-stately/slider" "^3.6.1" + "@react-stately/table" "^3.13.1" + "@react-stately/tabs" "^3.7.1" + "@react-stately/toggle" "^3.8.1" + "@react-stately/tooltip" "^3.5.1" + "@react-stately/tree" "^3.8.7" + "@react-types/shared" "^3.27.0" + react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" @@ -11977,12 +13035,10 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, react@18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" +react@*, react@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" + integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== readable-stream@^3.4.0: version "3.6.2" @@ -12427,12 +13483,10 @@ scheduler@0.25.0-rc-603e6108-20241029: resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz#684dd96647e104d23e0d29a37f18937daf82df19" integrity sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA== -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" +scheduler@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" + integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== schema-utils@^3.2.0: version "3.3.0" @@ -12964,10 +14018,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -styled-components@6.1.13: - version "6.1.13" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.13.tgz#2d777750b773b31469bd79df754a32479e9f475e" - integrity sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw== +styled-components@6.1.14: + version "6.1.14" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.14.tgz#addd3b645f400f8aad84c992afec58804ad1d217" + integrity sha512-KtfwhU5jw7UoxdM0g6XU9VZQFV4do+KrM8idiVCH5h4v49W+3p3yMe0icYwJgZQZepa5DbH04Qv8P0/RdcLcgg== dependencies: "@emotion/is-prop-valid" "1.2.2" "@emotion/unitless" "0.8.1" @@ -12986,29 +14040,29 @@ styled-jsx@5.1.6: dependencies: client-only "0.0.1" -stylelint-config-recommended@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" - integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg== +stylelint-config-recommended@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-15.0.0.tgz#93d48db401215708b724f078533864e52085a07b" + integrity sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA== -stylelint-config-standard@36.0.1: - version "36.0.1" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz#727cbb2a1ef3e210f5ce8329cde531129f156609" - integrity sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw== +stylelint-config-standard@37.0.0: + version "37.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-37.0.0.tgz#55e75c7215d5398b096d2f75af6a16693c18532d" + integrity sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA== dependencies: - stylelint-config-recommended "^14.0.1" + stylelint-config-recommended "^15.0.0" -stylelint-prettier@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/stylelint-prettier/-/stylelint-prettier-5.0.2.tgz#82c0a813d8981fe094fca28126fc88cee22fa789" - integrity sha512-qJ+BN+1T2ZcKz9WIrv0x+eFGHzSUnXfXd5gL///T6XoJvr3D8/ztzz2fhtmXef7Vb8P33zBXmLTTveByr0nwBw== +stylelint-prettier@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/stylelint-prettier/-/stylelint-prettier-5.0.3.tgz#470134ec5ed86501119be9a5cb44709b467d7c91" + integrity sha512-B6V0oa35ekRrKZlf+6+jA+i50C4GXJ7X1PPmoCqSUoXN6BrNF6NhqqhanvkLjqw2qgvrS0wjdpeC+Tn06KN3jw== dependencies: prettier-linter-helpers "^1.0.0" -stylelint@16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.12.0.tgz#13532dcbaed21348da0e9e0fb9a4e1e7f6dab2b8" - integrity sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg== +stylelint@16.14.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.14.1.tgz#32d3df8c5ce7ba0275ce6a4a966b6099d7a828e3" + integrity sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw== dependencies: "@csstools/css-parser-algorithms" "^3.0.4" "@csstools/css-tokenizer" "^3.0.3" @@ -13019,16 +14073,16 @@ stylelint@16.12.0: colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.3" - css-tree "^3.0.1" + css-tree "^3.1.0" debug "^4.3.7" - fast-glob "^3.3.2" + fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" - file-entry-cache "^9.1.0" + file-entry-cache "^10.0.5" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^6.0.2" + ignore "^7.0.3" imurmurhash "^0.1.4" is-plain-object "^5.0.0" known-css-properties "^0.35.0" @@ -13037,7 +14091,7 @@ stylelint@16.12.0: micromatch "^4.0.8" normalize-path "^3.0.0" picocolors "^1.1.1" - postcss "^8.4.49" + postcss "^8.5.1" postcss-resolve-nested-selector "^0.1.6" postcss-safe-parser "^7.0.1" postcss-selector-parser "^7.0.0" @@ -13371,6 +14425,11 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== +ts-api-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" + integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== + ts-jest@29.2.5: version "29.2.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" @@ -13527,10 +14586,10 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript@*, typescript@5.7.2, typescript@^5.0.4: - version "5.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" - integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +typescript@*, typescript@5.7.3, typescript@^5.0.4: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" @@ -14532,7 +15591,14 @@ yargs@17.7.2, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yjs@13.6.21, yjs@^13.6.15: +yjs@13.6.23: + version "13.6.23" + resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.23.tgz#62358dfa52e92dc870b8a0bedcf0d4cbd4c5ffa8" + integrity sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few== + dependencies: + lib0 "^0.2.99" + +yjs@^13.6.15: version "13.6.21" resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.21.tgz#888b7077a7236120ae6b74e58ddbef3c9863825a" integrity sha512-/fzzyeCAfr3Qwx1D71zvumm64x+Q5MEFel6EhWlA1IBFxWPb7tei4J2a8CJyjpYHfVrRij5q3RJTK9W2Iqjouw== @@ -14554,10 +15620,10 @@ yoga-layout@^3.1.0: resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-3.2.1.tgz#d2d1ba06f0e81c2eb650c3e5ad8b0b4adde1e843" integrity sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ== -zustand@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.2.tgz#f7595ada55a565f1fd6464f002a91e701ee0cfca" - integrity sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw== +zustand@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.3.tgz#b323435b73d06b2512e93c77239634374b0e407f" + integrity sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg== zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" From 83dfd26d1c817c815140789819610029de4bb91d Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 29 Jan 2025 15:35:12 +0100 Subject: [PATCH 21/22] =?UTF-8?q?=E2=AC=87=EF=B8=8F(frontend)=20downgrade?= =?UTF-8?q?=20to=20react=2018?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We still have conflict with React 19, better to downgrade to react 18 for the moment. We add the react 18 libs to renovate.json to prevent future upgrade with Renovate. An issue will be open to upgrade to React 19 manually. --- renovate.json | 6 +- src/frontend/apps/impress/package.json | 2 +- src/frontend/package.json | 6 +- src/frontend/yarn.lock | 2357 +++++++----------------- 4 files changed, 668 insertions(+), 1703 deletions(-) diff --git a/renovate.json b/renovate.json index e0112815..aea7be91 100644 --- a/renovate.json +++ b/renovate.json @@ -14,10 +14,14 @@ "groupName": "ignored js dependencies", "matchManagers": ["npm"], "matchPackageNames": [ + "@types/react", + "@types/react-dom", + "eslint", "fetch-mock", "node", "node-fetch", - "eslint", + "react", + "react-dom", "workbox-webpack-plugin" ] } diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index 77b4c115..91525f2c 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -59,7 +59,7 @@ "@types/lodash": "4.17.15", "@types/luxon": "3.4.2", "@types/node": "*", - "@types/react": "19.0.8", + "@types/react": "18.3.12", "@types/react-dom": "*", "cross-env": "7.0.3", "dotenv": "16.4.7", diff --git a/src/frontend/package.json b/src/frontend/package.json index 76369810..43975de8 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -29,12 +29,12 @@ }, "resolutions": { "@types/node": "22.12.0", - "@types/react-dom": "19.0.3", + "@types/react-dom": "18.3.1", "@typescript-eslint/eslint-plugin": "8.22.0", "@typescript-eslint/parser": "8.22.0", "eslint": "8.57.0", - "react": "19.0.0", - "react-dom": "19.0.0", + "react": "18.3.1", + "react-dom": "18.3.1", "typescript": "5.7.3" } } diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index db051d71..ae4c8e1f 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -24,7 +24,18 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": +"@asamuzakjp/css-color@^2.8.2": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-2.8.3.tgz#665f0f5e8edb95d8f543847529e30fe5cc437ef7" + integrity sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw== + dependencies: + "@csstools/css-calc" "^2.1.1" + "@csstools/css-color-parser" "^3.0.7" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -33,39 +44,39 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" - integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" + integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== "@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" + integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/traverse" "^7.26.7" + "@babel/types" "^7.26.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -77,12 +88,12 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -153,10 +164,10 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" @@ -168,13 +179,13 @@ "@babel/traverse" "^7.25.9" "@babel/helper-replace-supers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" - integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== dependencies: "@babel/helper-member-expression-to-functions" "^7.25.9" "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" @@ -208,20 +219,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@babel/helpers@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" + integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== dependencies: "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.7" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" + integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.7" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -426,12 +437,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" - integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-block-scoping@^7.25.9": version "7.25.9" @@ -513,7 +524,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.25.9": +"@babel/plugin-transform-exponentiation-operator@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== @@ -580,7 +591,7 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.25.9": +"@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -621,12 +632,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" - integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-numeric-separator@^7.25.9": version "7.25.9" @@ -790,21 +801,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" - integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-typescript@^7.25.9": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" - integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz#64339515ea3eff610160f62499c3ef437d0ac83d" + integrity sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-syntax-typescript" "^7.25.9" @@ -840,13 +851,13 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.20.2": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" - integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.7.tgz#24d38e211f4570b8d806337035cc3ae798e0c36d" + integrity sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ== dependencies: - "@babel/compat-data" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/compat-data" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" @@ -860,7 +871,7 @@ "@babel/plugin-transform-arrow-functions" "^7.25.9" "@babel/plugin-transform-async-generator-functions" "^7.25.9" "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" "@babel/plugin-transform-block-scoping" "^7.25.9" "@babel/plugin-transform-class-properties" "^7.25.9" "@babel/plugin-transform-class-static-block" "^7.26.0" @@ -871,7 +882,7 @@ "@babel/plugin-transform-duplicate-keys" "^7.25.9" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" "@babel/plugin-transform-export-namespace-from" "^7.25.9" "@babel/plugin-transform-for-of" "^7.25.9" "@babel/plugin-transform-function-name" "^7.25.9" @@ -880,12 +891,12 @@ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" "@babel/plugin-transform-member-expression-literals" "^7.25.9" "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" "@babel/plugin-transform-modules-systemjs" "^7.25.9" "@babel/plugin-transform-modules-umd" "^7.25.9" "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" "@babel/plugin-transform-numeric-separator" "^7.25.9" "@babel/plugin-transform-object-rest-spread" "^7.25.9" "@babel/plugin-transform-object-super" "^7.25.9" @@ -902,7 +913,7 @@ "@babel/plugin-transform-spread" "^7.25.9" "@babel/plugin-transform-sticky-regex" "^7.25.9" "@babel/plugin-transform-template-literals" "^7.25.9" - "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" "@babel/plugin-transform-unicode-escapes" "^7.25.9" "@babel/plugin-transform-unicode-property-regex" "^7.25.9" "@babel/plugin-transform-unicode-regex" "^7.25.9" @@ -947,9 +958,9 @@ "@babel/plugin-transform-typescript" "^7.25.9" "@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.5", "@babel/runtime@^7.25.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" + integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== dependencies: regenerator-runtime "^0.14.0" @@ -962,23 +973,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" + integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" + integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1103,6 +1114,24 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/color-helpers@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.1.tgz#829f1c76f5800b79c51c709e2f36821b728e0e10" + integrity sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA== + +"@csstools/css-calc@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.1.tgz#a7dbc66627f5cf458d42aed14bda0d3860562383" + integrity sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag== + +"@csstools/css-color-parser@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz#442d61d58e54ad258d52c309a787fceb33906484" + integrity sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA== + dependencies: + "@csstools/color-helpers" "^5.0.1" + "@csstools/css-calc" "^2.1.1" + "@csstools/css-parser-algorithms@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" @@ -1403,19 +1432,19 @@ integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@floating-ui/core@^1.6.0": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" - integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== dependencies: - "@floating-ui/utils" "^0.2.8" + "@floating-ui/utils" "^0.2.9" "@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.0.1": - version "1.6.12" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" - integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== + version "1.6.13" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== dependencies: "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.8" + "@floating-ui/utils" "^0.2.9" "@floating-ui/react-dom@^2.1.2": version "2.1.2" @@ -1433,10 +1462,10 @@ "@floating-ui/utils" "^0.2.8" tabbable "^6.0.0" -"@floating-ui/utils@^0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" - integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== +"@floating-ui/utils@^0.2.8", "@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== "@fontsource-variable/roboto-flex@5.1.1": version "5.1.1" @@ -1448,44 +1477,44 @@ resolved "https://registry.yarnpkg.com/@fontsource/material-icons-outlined/-/material-icons-outlined-5.1.1.tgz#3a659277f5029fb1ea5f64739d7ef48fd2112a8e" integrity sha512-HjWe3anHu9RptoAvm2UF6MPXkwsbFbH+vkg48GRIhXPsXyfmZteGHVFZpPxaZnakrmnLXDxUnnKSj7zzqk+Rhg== -"@formatjs/ecma402-abstract@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz#cdeb3ffe1aeea9c4284b85b7e37e8e8615314c39" - integrity sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw== +"@formatjs/ecma402-abstract@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.2.tgz#0ee291effe7ee2c340742a6c95d92eacb5e6c00a" + integrity sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg== dependencies: - "@formatjs/fast-memoize" "2.2.5" - "@formatjs/intl-localematcher" "0.5.9" + "@formatjs/fast-memoize" "2.2.6" + "@formatjs/intl-localematcher" "0.5.10" decimal.js "10" tslib "2" -"@formatjs/fast-memoize@2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz#54a4a1793d773b72c372d3dcab3595149aee7880" - integrity sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g== +"@formatjs/fast-memoize@2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.6.tgz#fac0a84207a1396be1f1aa4ee2805b179e9343d1" + integrity sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw== dependencies: tslib "2" -"@formatjs/icu-messageformat-parser@2.9.7": - version "2.9.7" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz#84abd5c86ef2ad7cb82da63b3380c33808efb6da" - integrity sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA== +"@formatjs/icu-messageformat-parser@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.0.tgz#28d22a735114b7309c0d3e43d39f2660917867c8" + integrity sha512-Hp81uTjjdTk3FLh/dggU5NK7EIsVWc5/ZDWrIldmf2rBuPejuZ13CZ/wpVE2SToyi4EiroPTQ1XJcJuZFIxTtw== dependencies: - "@formatjs/ecma402-abstract" "2.3.1" - "@formatjs/icu-skeleton-parser" "1.8.11" + "@formatjs/ecma402-abstract" "2.3.2" + "@formatjs/icu-skeleton-parser" "1.8.12" tslib "2" -"@formatjs/icu-skeleton-parser@1.8.11": - version "1.8.11" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz#e7c9918274dfa0c1c2bca1ab6e15ef49b10cf0bb" - integrity sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw== +"@formatjs/icu-skeleton-parser@1.8.12": + version "1.8.12" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.12.tgz#43076747cdbe0f23bfac2b2a956bd8219716680d" + integrity sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg== dependencies: - "@formatjs/ecma402-abstract" "2.3.1" + "@formatjs/ecma402-abstract" "2.3.2" tslib "2" -"@formatjs/intl-localematcher@0.5.9": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz#43c6ee22be85b83340bcb09bdfed53657a2720db" - integrity sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA== +"@formatjs/intl-localematcher@0.5.10": + version "0.5.10" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz#1e0bd3fc1332c1fe4540cfa28f07e9227b659a58" + integrity sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q== dependencies: tslib "2" @@ -1662,14 +1691,14 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== -"@internationalized/date@3.6.0", "@internationalized/date@^3.6.0": +"@internationalized/date@3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.6.0.tgz#b30d43030bfed1855f20c9503606926d75bfdf64" integrity sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/date@^3.7.0": +"@internationalized/date@^3.6.0", "@internationalized/date@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.7.0.tgz#23a4956308ee108e308517a7137c69ab8f5f2ad9" integrity sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ== @@ -1967,21 +1996,21 @@ integrity sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw== "@mantine/core@^7.10.1": - version "7.15.2" - resolved "https://registry.yarnpkg.com/@mantine/core/-/core-7.15.2.tgz#9c21d5afe5e43fe0a58fb4b1166ded0a67fa1eae" - integrity sha512-640ns0L/HZAXYjz3+FRffr8UNcH1fU7ENUVxKLzqNA311Dcx0qS3byVKTY/IVJYln6AkjoEfIJMiixT9fCZBiQ== + version "7.16.2" + resolved "https://registry.yarnpkg.com/@mantine/core/-/core-7.16.2.tgz#feffc178adfdae0b073c24fd758a7793d0cf95e3" + integrity sha512-6dwFz+8HrOqFan7GezgpoWyZSCxedh10S8iILGVsc3GXiD4gzo+3VZndZKccktkYZ3GVC9E3cCS3SxbiyKSAVw== dependencies: "@floating-ui/react" "^0.26.28" clsx "^2.1.1" - react-number-format "^5.4.2" - react-remove-scroll "^2.6.0" + react-number-format "^5.4.3" + react-remove-scroll "^2.6.2" react-textarea-autosize "8.5.6" type-fest "^4.27.0" "@mantine/hooks@^7.10.1": - version "7.15.2" - resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.15.2.tgz#f583ecfb7b92cad17c67f7825f20f23b72e6d7ff" - integrity sha512-p8dsW0fdJxzYhULbm1noFYRHuBvJHleYviC0BlwbkVySC8AsvFI8AmC3sMssWV3dQ3yQ/SidYo9U+K/czpDpZw== + version "7.16.2" + resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.16.2.tgz#24163bcb7b7f862bdd984e26180dbda12bae1588" + integrity sha512-ZFHQhDi9T+r6VR5NEeE47gigPPIAHVIKDOCWsCsbCqHc3yz5l8kiO2RdfUmsTKV2KD/AiXnAw4b6pjQEP58GOg== "@mantine/utils@^6.0.21": version "6.0.22" @@ -2093,14 +2122,14 @@ react-stately "3.34.0" "@openfun/cunningham-tokens@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@openfun/cunningham-tokens/-/cunningham-tokens-2.1.1.tgz#a53860ef5a9bb0730909267882e3e1bc5ecc9b98" - integrity sha512-pIPpBbz3ZGuk5iKlicKBIGdOmMomFyAvBhL31wAzvb2ftH4G61xqKYd4Qrq//ToZqapm70V9xoWHMRnL0pvTvQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@openfun/cunningham-tokens/-/cunningham-tokens-2.2.0.tgz#9ebab9e86ccddd97888e3be1413e0ffd2f81dcce" + integrity sha512-ZLMbb5LTqGIJarNjs6/qB/Ga1jtyvJGoOcCqgb/X1UltkmM1A0JMERFv9fwIausuvwSdfAxQgawPav0F5SlUTw== dependencies: chalk "4.1.2" - commander "12.0.0" + commander "13.0.0" deepmerge "4.3.1" - figlet "1.7.0" + figlet "1.8.0" ts-node "10.9.2" "@opentelemetry/api-logs@0.53.0": @@ -2123,9 +2152,9 @@ integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== "@opentelemetry/context-async-hooks@^1.29.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz#5639c8a7d19c6fe04a44b86aa302cb09008f6db9" - integrity sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz#4f76280691a742597fd0bf682982126857622948" + integrity sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA== "@opentelemetry/core@1.29.0": version "1.29.0" @@ -2134,10 +2163,10 @@ dependencies: "@opentelemetry/semantic-conventions" "1.28.0" -"@opentelemetry/core@1.30.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.26.0", "@opentelemetry/core@^1.29.0", "@opentelemetry/core@^1.8.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.0.tgz#ef959e11e137d72466e566e375ecc5a82e922b86" - integrity sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA== +"@opentelemetry/core@1.30.1", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.26.0", "@opentelemetry/core@^1.29.0", "@opentelemetry/core@^1.8.0": + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27" + integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== dependencies: "@opentelemetry/semantic-conventions" "1.28.0" @@ -2378,21 +2407,21 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz#906ac8e4d804d4109f3ebd5c224ac988276fdc47" integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g== -"@opentelemetry/resources@1.30.0", "@opentelemetry/resources@^1.29.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.30.0.tgz#87604359e6195c017075b7d294a949ad018e692d" - integrity sha512-5mGMjL0Uld/99t7/pcd7CuVtJbkARckLVuiOX84nO8RtLtIz0/J6EOHM2TGvPZ6F4K+XjUq13gMx14w80SVCQg== +"@opentelemetry/resources@1.30.1", "@opentelemetry/resources@^1.29.0": + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.30.1.tgz#a4eae17ebd96947fdc7a64f931ca4b71e18ce964" + integrity sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA== dependencies: - "@opentelemetry/core" "1.30.0" + "@opentelemetry/core" "1.30.1" "@opentelemetry/semantic-conventions" "1.28.0" "@opentelemetry/sdk-trace-base@^1.22", "@opentelemetry/sdk-trace-base@^1.29.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.0.tgz#27c68ab01b1cfb4af16356550f8091d6e727f182" - integrity sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz#41a42234096dc98e8f454d24551fc80b816feb34" + integrity sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg== dependencies: - "@opentelemetry/core" "1.30.0" - "@opentelemetry/resources" "1.30.0" + "@opentelemetry/core" "1.30.1" + "@opentelemetry/resources" "1.30.1" "@opentelemetry/semantic-conventions" "1.28.0" "@opentelemetry/semantic-conventions@1.27.0": @@ -2454,14 +2483,14 @@ integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== "@radix-ui/react-dialog@^1.1.2": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz#d68e977acfcc0d044b9dab47b6dd2c179d2b3191" - integrity sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA== + version "1.1.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz#1bb2880e6b0ef9d9d0d9f440e1414c94bbacb55b" + integrity sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw== dependencies: "@radix-ui/primitive" "1.1.1" "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.3" + "@radix-ui/react-dismissable-layer" "1.1.4" "@radix-ui/react-focus-guards" "1.1.1" "@radix-ui/react-focus-scope" "1.1.1" "@radix-ui/react-id" "1.1.0" @@ -2470,13 +2499,13 @@ "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-slot" "1.1.1" "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "^2.6.1" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.2" -"@radix-ui/react-dismissable-layer@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz#4ee0f0f82d53bf5bd9db21665799bb0d1bad5ed8" - integrity sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg== +"@radix-ui/react-dismissable-layer@1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.4.tgz#6e31ad92e7d9e77548001fd8c04f8561300c02a9" + integrity sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA== dependencies: "@radix-ui/primitive" "1.1.1" "@radix-ui/react-compose-refs" "1.1.1" @@ -2578,19 +2607,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/breadcrumbs@^3.5.19": - version "3.5.19" - resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.19.tgz#e0a67e0e7017089fa0ee5eadd51a6da505b94cd4" - integrity sha512-mVngOPFYVVhec89rf/CiYQGTfaLRfHFtX+JQwY7sNYNqSA+gO8p4lNARe3Be6bJPgH+LUQuruIY9/ZDL6LT3HA== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/link" "^3.7.7" - "@react-aria/utils" "^3.26.0" - "@react-types/breadcrumbs" "^3.7.9" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/breadcrumbs@^3.5.20": +"@react-aria/breadcrumbs@^3.5.19", "@react-aria/breadcrumbs@^3.5.20": version "3.5.20" resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.20.tgz#b4b2d8647b6386d34c721db4a22f1675c63c1a97" integrity sha512-xqVSSDPpQuUFpJyIXMQv8L7zumk5CeGX7qTzo4XRvqm5T9qnNAX4XpYEMdktnLrQRY/OemCBScbx7SEwr0B3Kg== @@ -2602,21 +2619,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/button@^3.11.0": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.11.0.tgz#cb7790db23949ec9c1e698fa531ee5471cf2b515" - integrity sha512-b37eIV6IW11KmNIAm65F3SEl2/mgj5BrHIysW6smZX3KoKWTGYsYfcQkmtNgY0GOSFfDxMCoolsZ6mxC00nSDA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/interactions" "^3.22.5" - "@react-aria/toolbar" "3.0.0-beta.11" - "@react-aria/utils" "^3.26.0" - "@react-stately/toggle" "^3.8.0" - "@react-types/button" "^3.10.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/button@^3.11.1": +"@react-aria/button@^3.11.0", "@react-aria/button@^3.11.1": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.11.1.tgz#f285ab52ecb613d2233e3a54c6f3d4f394b6062d" integrity sha512-NSs2HxHSSPSuYy5bN+PMJzsCNDVsbm1fZ/nrWM2WWWHTBrx9OqyrEXZVV9ebzQCN9q0nzhwpf6D42zHIivWtJA== @@ -2630,7 +2633,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@3.6.0", "@react-aria/calendar@^3.6.0": +"@react-aria/calendar@3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.6.0.tgz#d5e7cf4beb8724648a7042dbc5bb519de4351906" integrity sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg== @@ -2646,7 +2649,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@^3.7.0": +"@react-aria/calendar@^3.6.0", "@react-aria/calendar@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.7.0.tgz#b0a13dc0acc762157cc774e96dd5dfe8cd624c10" integrity sha512-9YUbgcox7cQgvZfQtL2BLLRsIuX4mJeclk9HkFoOsAu3RGO5HNsteah8FV54W8BMjm/bNRXIPUxtjTTP+1L6jg== @@ -2662,24 +2665,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/checkbox@^3.15.0": - version "3.15.0" - resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.15.0.tgz#4d224b71c65d6a079ff935ab22c806323f84b746" - integrity sha512-z/8xd4em7o0MroBXwkkwv7QRwiJaA1FwqMhRUb7iqtBGP2oSytBEDf0N7L09oci32a1P4ZPz2rMK5GlLh/PD6g== - dependencies: - "@react-aria/form" "^3.0.11" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/toggle" "^3.10.10" - "@react-aria/utils" "^3.26.0" - "@react-stately/checkbox" "^3.6.10" - "@react-stately/form" "^3.1.0" - "@react-stately/toggle" "^3.8.0" - "@react-types/checkbox" "^3.9.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/checkbox@^3.15.1": +"@react-aria/checkbox@^3.15.0", "@react-aria/checkbox@^3.15.1": version "3.15.1" resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.15.1.tgz#384806adc3c2700cb09b2c4e03d8ad25c8ec3892" integrity sha512-ETgsMDZ0IZzRXy/OVlGkazm8T+PcMHoTvsxp0c+U82c8iqdITA+VJ615eBPOQh6OkkYIIn4cRn/e+69RmGzXng== @@ -2718,26 +2704,7 @@ "@swc/helpers" "^0.5.0" use-sync-external-store "^1.2.0" -"@react-aria/color@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.2.tgz#3abeb7e9fa9756e1823e513921e04dcaa47b25cc" - integrity sha512-dSM5qQRcR1gRGYCBw0IGRmc29gjfoht3cQleKb8MMNcgHYa2oi5VdCs2yKXmYFwwVC6uPtnlNy9S6e0spqdr+w== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/numberfield" "^3.11.9" - "@react-aria/slider" "^3.7.14" - "@react-aria/spinbutton" "^3.6.10" - "@react-aria/textfield" "^3.15.0" - "@react-aria/utils" "^3.26.0" - "@react-aria/visually-hidden" "^3.8.18" - "@react-stately/color" "^3.8.1" - "@react-stately/form" "^3.1.0" - "@react-types/color" "^3.0.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/color@^3.0.3": +"@react-aria/color@^3.0.2", "@react-aria/color@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.3.tgz#28048b8f0d7986bd2f9678e72a135bef15f48a93" integrity sha512-DDVma2107VHBfSuEnnmy+KJvXvxEXWSAooii2vlHHmQNb5x4rv4YTk+dP5GZl/7MgT8OgPTB9UHoC83bXFMDRA== @@ -2756,28 +2723,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/combobox@^3.11.0": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.0.tgz#9489aaad342d092bf1fe1c4c382f6714316ac1c4" - integrity sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/listbox" "^3.13.6" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/menu" "^3.16.0" - "@react-aria/overlays" "^3.24.0" - "@react-aria/selection" "^3.21.0" - "@react-aria/textfield" "^3.15.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/collections" "^3.12.0" - "@react-stately/combobox" "^3.10.1" - "@react-stately/form" "^3.1.0" - "@react-types/button" "^3.10.1" - "@react-types/combobox" "^3.13.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/combobox@^3.11.1": +"@react-aria/combobox@^3.11.0", "@react-aria/combobox@^3.11.1": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.1.tgz#1bb3e390dc4fbe94c5f5c7b1f600f656abd2a8a1" integrity sha512-TTNbGhUuqxzPcJzd6hufOxuHzX0UARkw+0bl+TuCwNPQnqrcPf20EoOZvd3MHZwGq6GCP4QV+qo0uGx83RpUvA== @@ -2798,7 +2744,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@3.12.0", "@react-aria/datepicker@^3.12.0": +"@react-aria/datepicker@3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.12.0.tgz#a82ff3ebd3ead20a00096d082c1e6be47bbd5886" integrity sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg== @@ -2822,7 +2768,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@^3.13.0": +"@react-aria/datepicker@^3.12.0", "@react-aria/datepicker@^3.13.0": version "3.13.0" resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.13.0.tgz#ea1f5085da5b8b50c932e94716a7f8bdd0f489f0" integrity sha512-TmJan65P3Vk7VDBNW5rH9Z25cAn0vk8TEtaP3boCs8wJFE+HbEuB8EqLxBFu47khtuKTEqDP3dTlUh2Vt/f7Xw== @@ -2846,19 +2792,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/dialog@^3.5.20": - version "3.5.20" - resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.20.tgz#6404d2c1bab1ea9ecce3ebc7adce64733ecea985" - integrity sha512-l0GZVLgeOd3kL3Yj8xQW7wN3gn9WW3RLd/SGI9t7ciTq+I/FhftjXCWzXLlOCCTLMf+gv7eazecECtmoWUaZWQ== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/overlays" "^3.24.0" - "@react-aria/utils" "^3.26.0" - "@react-types/dialog" "^3.5.14" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dialog@^3.5.21": +"@react-aria/dialog@^3.5.20", "@react-aria/dialog@^3.5.21": version "3.5.21" resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.21.tgz#ded634dda5c16b720595f4a1aaa0cfb09b4979ff" integrity sha512-tBsn9swBhcptJ9QIm0+ur0PVR799N6qmGguva3rUdd+gfitknFScyT08d7AoMr9AbXYdJ+2R9XNSZ3H3uIWQMw== @@ -2870,18 +2804,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/disclosure@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@react-aria/disclosure/-/disclosure-3.0.0.tgz#36342210740fd659ad97678fe5a57896a7fcbd10" - integrity sha512-xO9QTQSvymujTjCs1iCQ4+dKZvtF/rVVaFZBKlUtqIqwTHMdqeZu4fh5miLEnTyVLNHMGzLrFggsd8Q+niC9Og== - dependencies: - "@react-aria/ssr" "^3.9.7" - "@react-aria/utils" "^3.26.0" - "@react-stately/disclosure" "^3.0.0" - "@react-types/button" "^3.10.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/disclosure@^3.0.1": +"@react-aria/disclosure@^3.0.0", "@react-aria/disclosure@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@react-aria/disclosure/-/disclosure-3.0.1.tgz#a4ddecc8fe031c73c760d9de6fa241b88cf47171" integrity sha512-rNH8RFcePoAQizcqB7KuHbBOr7sPsysFKCUwbVSOXLPgvCfXKafIhjgFJVqekfsbn5zWvkcTupnzGVJj/F9p+g== @@ -2892,23 +2815,7 @@ "@react-types/button" "^3.10.2" "@swc/helpers" "^0.5.0" -"@react-aria/dnd@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.8.0.tgz#7e3bfa3f509efeb9a872686e65641a719684e95a" - integrity sha512-JiqHY3E9fDU5Kb4gN22cuK6QNlpMCGe6ngR/BV+Q8mLEsdoWcoUAYOtYXVNNTRvCdVbEWI87FUU+ThyPpoDhNQ== - dependencies: - "@internationalized/string" "^3.2.5" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/overlays" "^3.24.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/dnd" "^3.5.0" - "@react-types/button" "^3.10.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dnd@^3.8.1": +"@react-aria/dnd@^3.8.0", "@react-aria/dnd@^3.8.1": version "3.8.1" resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.8.1.tgz#acb1aae522c6e28b9eb0ae1ff5f009e28962fba4" integrity sha512-FoXYQ4z33E9YBzIGRJM1B1oZep6CvEWgXvjCZGURatjr3qG7vf95mOqA5kVd9bjLL7QK4w0ujJWEBfog3WmufA== @@ -2924,18 +2831,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/focus@^3.19.0": - version "3.19.0" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.0.tgz#82b9a5b83f023b943a7970df3d059f49d61df05d" - integrity sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A== - dependencies: - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-aria/focus@^3.19.1": +"@react-aria/focus@^3.19.0", "@react-aria/focus@^3.19.1": version "3.19.1" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.1.tgz#6655e53d04eb7b46c8d39e671013d1c17fca5ba2" integrity sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg== @@ -2946,18 +2842,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@^3.0.11": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.11.tgz#84511874e1fad5f981bae97ebd4d549923849455" - integrity sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw== - dependencies: - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-stately/form" "^3.1.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/form@^3.0.12": +"@react-aria/form@^3.0.11", "@react-aria/form@^3.0.12": version "3.0.12" resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.12.tgz#1d916c15dfa050e4c02a689151a92b4d10bec445" integrity sha512-8uvPYEd3GDyGt5NRJIzdWW1Ry5HLZq37vzRZKUW8alZ2upFMH3KJJG55L9GP59KiF6zBrYBebvI/YK1Ye1PE1g== @@ -2968,25 +2853,6 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/grid@^3.11.0": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.11.0.tgz#5ad6596745482e109b3b47f1fec7ce372f632707" - integrity sha512-lN5FpQgu2Rq0CzTPWmzRpq6QHcMmzsXYeClsgO3108uVp1/genBNAObYVTxGOKe/jb9q99trz8EtIn05O6KN1g== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/collections" "^3.12.0" - "@react-stately/grid" "^3.10.0" - "@react-stately/selection" "^3.18.0" - "@react-types/checkbox" "^3.9.0" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - "@react-aria/grid@^3.11.1": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.11.1.tgz#51aa217620e811af7df7fef5315df42525bd3b0b" @@ -3006,24 +2872,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/gridlist@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.10.0.tgz#adc2f9896a2759bb29cec428378c8ac85235a110" - integrity sha512-UcblfSZ7kJBrjg9mQ5VbnRevN81UiYB4NuL5PwIpBpridO7tnl4ew6+96PYU7Wj1chHhPS3x0b0zmuSVN7A0LA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/grid" "^3.11.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/collections" "^3.12.0" - "@react-stately/list" "^3.11.1" - "@react-stately/tree" "^3.8.6" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/gridlist@^3.10.1": +"@react-aria/gridlist@^3.10.0", "@react-aria/gridlist@^3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.10.1.tgz#75d2316633b3636607e448602bf518f7f9a9b59d" integrity sha512-11FlupBg5C9ehs7R6OjqMPWEOLK/4IuSrq7D1xU+Hnm7ZYI/KKcCXvNMjMmnOz/gGzOmfgVwz5PIKaY9aZarEg== @@ -3040,7 +2889,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@3.12.4", "@react-aria/i18n@^3.12.4": +"@react-aria/i18n@3.12.4": version "3.12.4" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.4.tgz#4520ce48a1b6ebe4aa470d72eba300e65de01814" integrity sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w== @@ -3054,7 +2903,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.12.5": +"@react-aria/i18n@^3.12.4", "@react-aria/i18n@^3.12.5": version "3.12.5" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.5.tgz#7dc2ab8bbf2374c1797e3c553f34735be88f52eb" integrity sha512-ooeop2pTG94PuaHoN2OTk2hpkqVuoqgEYxRvnc1t7DVAtsskfhS/gVOTqyWGsxvwAvRi7m/CnDu6FYdeQ/bK5w== @@ -3068,17 +2917,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@^3.22.5": - version "3.22.5" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.5.tgz#9cd8c93b8b6988f1d315d3efb450119d1432bbb8" - integrity sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ== - dependencies: - "@react-aria/ssr" "^3.9.7" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/interactions@^3.23.0": +"@react-aria/interactions@^3.22.5", "@react-aria/interactions@^3.23.0": version "3.23.0" resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.23.0.tgz#28fce22310faeaa114978728045fb2b4fe80acc8" integrity sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg== @@ -3088,16 +2927,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/label@^3.7.13": - version "3.7.13" - resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.13.tgz#9e7153a1ded878b5147d141effc3eb226f3c6c1f" - integrity sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg== - dependencies: - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/label@^3.7.14": +"@react-aria/label@^3.7.13", "@react-aria/label@^3.7.14": version "3.7.14" resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.14.tgz#a4922cbfbbe20e8e14b84b0c56c504d73257f094" integrity sha512-EN1Md2YvcC4sMqBoggsGYUEGlTNqUfJZWzduSt29fbQp1rKU2KlybTe+TWxKq/r2fFd+4JsRXxMeJiwB3w2AQA== @@ -3106,19 +2936,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/link@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.7.tgz#5879c75068b63d55353b3e96b4fda0fa8753d1ad" - integrity sha512-eVBRcHKhNSsATYWv5wRnZXRqPVcKAWWakyvfrYePIKpC3s4BaHZyTGYdefk8ZwZdEOuQZBqLMnjW80q1uhtkuA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-types/link" "^3.5.9" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/link@^3.7.8": +"@react-aria/link@^3.7.7", "@react-aria/link@^3.7.8": version "3.7.8" resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.8.tgz#26813464e1adf443ede93ce44d7e2d4a3510d25c" integrity sha512-oiXUPQLZmf9Q9Xehb/sG1QRxfo28NFKdh9w+unD12sHI6NdLMETl5MA4CYyTgI0dfMtTjtfrF68GCnWfc7JvXQ== @@ -3130,22 +2948,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@^3.13.6": - version "3.13.6" - resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.13.6.tgz#43ff24f4a6540a9952729833201460fa6ab081f7" - integrity sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg== - dependencies: - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/collections" "^3.12.0" - "@react-stately/list" "^3.11.1" - "@react-types/listbox" "^3.5.3" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/listbox@^3.14.0": +"@react-aria/listbox@^3.13.6", "@react-aria/listbox@^3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.14.0.tgz#5de653504b3600fc3eabc7fa92927ddb5731fee1" integrity sha512-pyVbKavh8N8iyiwOx6I3JIcICvAzFXkKSFni1yarfgngJsJV3KSyOkzLomOfN9UhbjcV4sX61/fccwJuvlurlA== @@ -3167,27 +2970,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@^3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.16.0.tgz#119e562806e9f8a39fd468ab790d788905c6df83" - integrity sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/overlays" "^3.24.0" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/collections" "^3.12.0" - "@react-stately/menu" "^3.9.0" - "@react-stately/selection" "^3.18.0" - "@react-stately/tree" "^3.8.6" - "@react-types/button" "^3.10.1" - "@react-types/menu" "^3.9.13" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/menu@^3.17.0": +"@react-aria/menu@^3.16.0", "@react-aria/menu@^3.17.0": version "3.17.0" resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.17.0.tgz#e4a645366c82420520852dd42649a563ee732939" integrity sha512-aiFvSv3G1YvPC0klJQ/9quB05xIDZzJ5Lt6/CykP0UwGK5i8GCqm6/cyFLwEXsS5ooUPxS3bqmdOsgdADSSgqg== @@ -3207,17 +2990,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/meter@^3.4.18": - version "3.4.18" - resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.18.tgz#ff3f85f32ea30285e7e73386a641efdcedd88205" - integrity sha512-tTX3LLlmDIHqrC42dkdf+upb1c4UbhlpZ52gqB64lZD4OD4HE+vMTwNSe+7MRKMLvcdKPWCRC35PnxIHZ15kfQ== - dependencies: - "@react-aria/progress" "^3.4.18" - "@react-types/meter" "^3.4.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/meter@^3.4.19": +"@react-aria/meter@^3.4.18", "@react-aria/meter@^3.4.19": version "3.4.19" resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.19.tgz#9cdb43c19749ec89d452b31e400dbac64cb2390d" integrity sha512-IIA+gTHrNVbMuBgcqdGLEKd/ZiKM2hOUqS6uztbT15dwPJTmtfJiTWA2872PiY52p+gqPSanZuTc2TXYJa+rew== @@ -3227,7 +3000,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/numberfield@^3.11.10": +"@react-aria/numberfield@^3.11.10", "@react-aria/numberfield@^3.11.9": version "3.11.10" resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.11.10.tgz#ce6b0325c296799ff976a396e733c2ef7c89f784" integrity sha512-bYbTfO9NbAKMFOfEGGs+lvlxk0I9L0lU3WD2PFQZWdaoBz9TCkL+vK0fJk1zsuKaVjeGsmHP9VesBPRmaP0MiA== @@ -3244,41 +3017,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/numberfield@^3.11.9": - version "3.11.9" - resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.11.9.tgz#175f801b18740534dca023cfd9ce0349eff940b0" - integrity sha512-3tiGPx2y4zyOV7PmdBASes99ZZsFTZAJTnU45Z+p1CW4131lw7y2ZhbojBl7U6DaXAJvi1z6zY6cq2UE9w5a0Q== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/spinbutton" "^3.6.10" - "@react-aria/textfield" "^3.15.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/form" "^3.1.0" - "@react-stately/numberfield" "^3.9.8" - "@react-types/button" "^3.10.1" - "@react-types/numberfield" "^3.8.7" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/overlays@^3.24.0": - version "3.24.0" - resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.24.0.tgz#7f97cd12506961abfab3ae653822cea05d1cacd3" - integrity sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/ssr" "^3.9.7" - "@react-aria/utils" "^3.26.0" - "@react-aria/visually-hidden" "^3.8.18" - "@react-stately/overlays" "^3.6.12" - "@react-types/button" "^3.10.1" - "@react-types/overlays" "^3.8.11" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/overlays@^3.25.0": +"@react-aria/overlays@^3.24.0", "@react-aria/overlays@^3.25.0": version "3.25.0" resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.25.0.tgz#794c4f2f08ea6ccdd18b3030776b3929a4950cdb" integrity sha512-UEqJJ4duowrD1JvwXpPZreBuK79pbyNjNxFUVpFSskpGEJe3oCWwsSDKz7P1O7xbx5OYp+rDiY8fk/sE5rkaKw== @@ -3295,19 +3034,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/progress@^3.4.18": - version "3.4.18" - resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.18.tgz#948859ce1b0e13d935da7d4cbe6812d451472fe4" - integrity sha512-FOLgJ9t9i1u3oAAimybJG6r7/soNPBnJfWo4Yr6MmaUv90qVGa1h6kiuM5m9H/bm5JobAebhdfHit9lFlgsCmg== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/label" "^3.7.13" - "@react-aria/utils" "^3.26.0" - "@react-types/progress" "^3.5.8" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/progress@^3.4.19": +"@react-aria/progress@^3.4.18", "@react-aria/progress@^3.4.19": version "3.4.19" resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.19.tgz#722ea3389da0d067b092b13fe01c3edb2a9c4ce7" integrity sha512-5HHnBJHqEUuY+dYsjIZDYsENeKr49VCuxeaDZ0OSahbOlloIOB1baCo/6jLBv1O1rwrAzZ2gCCPcVGed/cjrcw== @@ -3319,23 +3046,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/radio@^3.10.10": - version "3.10.10" - resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.10.tgz#18e2811fb3e72298414c880bd9405ea3f1d83f1f" - integrity sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/form" "^3.0.11" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/utils" "^3.26.0" - "@react-stately/radio" "^3.10.9" - "@react-types/radio" "^3.8.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/radio@^3.10.11": +"@react-aria/radio@^3.10.10", "@react-aria/radio@^3.10.11": version "3.10.11" resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.11.tgz#535ca489615e357292835026acb856d561651361" integrity sha512-R150HsBFPr1jLMShI4aBM8heCa1k6h0KEvnFRfTAOBu+B9hMSZOPB+d6GQOwGPysNlbset90Kej8G15FGHjqiA== @@ -3351,21 +3062,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/searchfield@^3.7.11": - version "3.7.11" - resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.7.11.tgz#2be234280cc4fb58a316db6ba1f95ea34754c043" - integrity sha512-wFf6QxtBFfoxy0ANxI0+ftFEBGynVCY0+ce4H4Y9LpUTQsIKMp3sdc7LoUFORWw5Yee6Eid5cFPQX0Ymnk+ZJg== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/textfield" "^3.15.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/searchfield" "^3.5.8" - "@react-types/button" "^3.10.1" - "@react-types/searchfield" "^3.5.10" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/searchfield@^3.8.0": +"@react-aria/searchfield@^3.7.11", "@react-aria/searchfield@^3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.8.0.tgz#72b836ed438cb0edff917881a033fd92f945919b" integrity sha512-AaZuH9YIWlMyE1m7cSjHCfOuQmlWN+w8HVW32TxeGGGL1kJsYAlSYWYHUyYFIKh245kq/m5zUxAxmw5Ygmnx5w== @@ -3379,27 +3076,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/select@^3.15.0": - version "3.15.0" - resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.15.0.tgz#e0b955ed908039f734805e852b58dec4b159adc9" - integrity sha512-zgBOUNy81aJplfc3NKDJMv8HkXjBGzaFF3XDzNfW8vJ7nD9rcTRUN5SQ1XCEnKMv12B/Euk9zt6kd+tX0wk1vQ== - dependencies: - "@react-aria/form" "^3.0.11" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/listbox" "^3.13.6" - "@react-aria/menu" "^3.16.0" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-aria/visually-hidden" "^3.8.18" - "@react-stately/select" "^3.6.9" - "@react-types/button" "^3.10.1" - "@react-types/select" "^3.9.8" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/select@^3.15.1": +"@react-aria/select@^3.15.0", "@react-aria/select@^3.15.1": version "3.15.1" resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.15.1.tgz#2497a78ad3ea87dc7e46f50e629594e69a5e840d" integrity sha512-FOtY1tuHt0YTHwOEy/sf7LEIL+Nnkho3wJmfpWQuTxsvMCF7UJdQPYPd6/jGCcCdiqW7H4iqyjUkSp6nk/XRWQ== @@ -3419,20 +3096,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/selection@^3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.21.0.tgz#c5660e73a38db5e3e1cdc722e408b4489f5f589a" - integrity sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-stately/selection" "^3.18.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/selection@^3.22.0": +"@react-aria/selection@^3.21.0", "@react-aria/selection@^3.22.0": version "3.22.0" resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.22.0.tgz#29dd953cde1e1a3ba44e1d30d097d2babed03e7f" integrity sha512-XFOrK525HX2eeWeLZcZscUAs5qsuC1ZxsInDXMjvLeAaUPtQNEhUKHj3psDAl6XDU4VV1IJo0qCmFTVqTTMZSg== @@ -3445,16 +3109,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/separator@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.4.4.tgz#7975177d256d8e864625d9823bf7a6de5a6b6460" - integrity sha512-dH+qt0Mdh0nhKXCHW6AR4DF8DKLUBP26QYWaoThPdBwIpypH/JVKowpPtWms1P4b36U6XzHXHnTTEn/ZVoCqNA== - dependencies: - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/separator@^3.4.5": +"@react-aria/separator@^3.4.4", "@react-aria/separator@^3.4.5": version "3.4.5" resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.4.5.tgz#e9303d2ea41e4f09e925df047bb082731c1bf518" integrity sha512-RQA9sKZdAEjP1Yrv0GpDdXgmXd56kXDE8atPDHEC0/A4lpYh/YFLfXcv1JW0Hlg4kBocdX2pB2INyDGhiD+yfw== @@ -3463,22 +3118,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/slider@^3.7.14": - version "3.7.14" - resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.14.tgz#25a362725d6cd71e9b86477362a36c847c73384e" - integrity sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/utils" "^3.26.0" - "@react-stately/slider" "^3.6.0" - "@react-types/shared" "^3.26.0" - "@react-types/slider" "^3.7.7" - "@swc/helpers" "^0.5.0" - -"@react-aria/slider@^3.7.15": +"@react-aria/slider@^3.7.14", "@react-aria/slider@^3.7.15": version "3.7.15" resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.15.tgz#5cbce3b8f4ac55ff7794124f7bb3cd2edab6ae01" integrity sha512-v9tujsuvJYRX0vE/vMYBzTT9FXbzrLsjkOrouNq+UdBIr7wRjIWTHHM0j+khb2swyCWNTbdv6Ce316Zqx2qWFg== @@ -3493,19 +3133,7 @@ "@react-types/slider" "^3.7.8" "@swc/helpers" "^0.5.0" -"@react-aria/spinbutton@^3.6.10": - version "3.6.10" - resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.10.tgz#72154873de807638e17570bd57e8491912b613b7" - integrity sha512-nhYEYk7xUNOZDaqiQ5w/nHH9ouqjJbabTWXH+KK7UR1oVGfo4z1wG94l8KWF3Z6SGGnBxzLJyTBguZ4g9aYTSg== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/utils" "^3.26.0" - "@react-types/button" "^3.10.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/spinbutton@^3.6.11": +"@react-aria/spinbutton@^3.6.10", "@react-aria/spinbutton@^3.6.11": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.11.tgz#e6b7b740b95568851c36d4840a348b4756b33641" integrity sha512-RM+gYS9tf9Wb+GegV18n4ArK3NBKgcsak7Nx1CkEgX9BjJ0yayWUHdfEjRRvxGXl+1z1n84cJVkZ6FUlWOWEZA== @@ -3524,18 +3152,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/switch@^3.6.10": - version "3.6.10" - resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.10.tgz#8fa5729bc4e76ac3df51389a8996873142daedb8" - integrity sha512-FtaI9WaEP1tAmra1sYlAkYXg9x75P5UtgY8pSbe9+1WRyWbuE1QZT+RNCTi3IU4fZ7iJQmXH6+VaMyzPlSUagw== - dependencies: - "@react-aria/toggle" "^3.10.10" - "@react-stately/toggle" "^3.8.0" - "@react-types/shared" "^3.26.0" - "@react-types/switch" "^3.5.7" - "@swc/helpers" "^0.5.0" - -"@react-aria/switch@^3.6.11": +"@react-aria/switch@^3.6.10", "@react-aria/switch@^3.6.11": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.11.tgz#cd2e2e2de005b039c7822e796b3117703198c63d" integrity sha512-paYCpH+oeL+8rgQK+cBJ+IaZ1sXSh3+50WPlg2LvLBta0QVfQhPR4juPvfXRpfHHhCjFBgF4/RGbV8q5zpl3vA== @@ -3546,28 +3163,7 @@ "@react-types/switch" "^3.5.8" "@swc/helpers" "^0.5.0" -"@react-aria/table@^3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.16.0.tgz#f0ffb51f52494e68f2c3b81fba44278fbdc48c28" - integrity sha512-9xF9S3CJ7XRiiK92hsIKxPedD0kgcQWwqTMtj3IBynpQ4vsnRiW3YNIzrn9C3apjknRZDTSta8O2QPYCUMmw2A== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/grid" "^3.11.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/utils" "^3.26.0" - "@react-aria/visually-hidden" "^3.8.18" - "@react-stately/collections" "^3.12.0" - "@react-stately/flags" "^3.0.5" - "@react-stately/table" "^3.13.0" - "@react-types/checkbox" "^3.9.0" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@react-types/table" "^3.10.3" - "@swc/helpers" "^0.5.0" - -"@react-aria/table@^3.16.1": +"@react-aria/table@^3.16.0", "@react-aria/table@^3.16.1": version "3.16.1" resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.16.1.tgz#06dd8a9b390057c02c059e2dfd05482ca6e97c51" integrity sha512-T28TIGnKnPBunyErDBmm5jUX7AyzT7NVWBo9pDSt9wUuEnz0rVNd7p9sjmP2+u7I645feGG9klcdpCvFeqrk8A== @@ -3588,21 +3184,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-aria/tabs@^3.9.8": - version "3.9.8" - resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.8.tgz#a0a647a4e2d1783125779473536419fd8caa9cfa" - integrity sha512-Nur/qRFBe+Zrt4xcCJV/ULXCS3Mlae+B89bp1Gl20vSDqk6uaPtGk+cS5k03eugOvas7AQapqNJsJgKd66TChw== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/tabs" "^3.7.0" - "@react-types/shared" "^3.26.0" - "@react-types/tabs" "^3.3.11" - "@swc/helpers" "^0.5.0" - -"@react-aria/tabs@^3.9.9": +"@react-aria/tabs@^3.9.8", "@react-aria/tabs@^3.9.9": version "3.9.9" resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.9.tgz#71d35657062bbfd9d2d31ecedeaf24980e6207c7" integrity sha512-oXPtANs16xu6MdMGLHjGV/2Zupvyp9CJEt7ORPLv5xAzSY5hSjuQHJLZ0te3Lh/KSG5/0o3RW/W5yEqo7pBQQQ== @@ -3616,23 +3198,7 @@ "@react-types/tabs" "^3.3.12" "@swc/helpers" "^0.5.0" -"@react-aria/tag@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.4.8.tgz#856899a53c2be2b8aea3d5aca020edf8608246b2" - integrity sha512-exWl52bsFtJuzaqMYvSnLteUoPqb3Wf+uICru/yRtREJsWVqjJF38NCVlU73Yqd9qMPTctDrboSZFAWAWKDxoA== - dependencies: - "@react-aria/gridlist" "^3.10.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/list" "^3.11.1" - "@react-types/button" "^3.10.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/tag@^3.4.9": +"@react-aria/tag@^3.4.8", "@react-aria/tag@^3.4.9": version "3.4.9" resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.4.9.tgz#41987e7fa88c758326071da15a242181d97ec8bb" integrity sha512-Vnps+zk8vYyjevv2Bc6vc9kSp9HFLKrKUDmrWMc0DfseypwJMc3Ya6F965ZVTjF9nuWrojNmvgusNu7qyXFShQ== @@ -3648,22 +3214,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@^3.15.0": - version "3.15.0" - resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.15.0.tgz#17ebac0b73f084622aaf9697576b82155bed67cb" - integrity sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/form" "^3.0.11" - "@react-aria/label" "^3.7.13" - "@react-aria/utils" "^3.26.0" - "@react-stately/form" "^3.1.0" - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@react-types/textfield" "^3.10.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/textfield@^3.16.0": +"@react-aria/textfield@^3.15.0", "@react-aria/textfield@^3.16.0": version "3.16.0" resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.16.0.tgz#1a20289e333d4a13db0d59301aaafcc8e010cf3a" integrity sha512-53RVpMeMDN/QoabqnYZ1lxTh1xTQ3IBYQARuayq5EGGMafyxoFHzttxUdSqkZGK/+zdSF2GfmjOYJVm2nDKuDQ== @@ -3678,19 +3229,6 @@ "@react-types/textfield" "^3.11.0" "@swc/helpers" "^0.5.0" -"@react-aria/toggle@^3.10.10": - version "3.10.10" - resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.10.tgz#444658bf606e6d56b1fd96737d5a552c93493979" - integrity sha512-QwMT/vTNrbrILxWVHfd9zVQ3mV2NdBwyRu+DphVQiFAXcmc808LEaIX2n0lI6FCsUDC9ZejCyvzd91/YemdZ1Q== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-stately/toggle" "^3.8.0" - "@react-types/checkbox" "^3.9.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - "@react-aria/toggle@^3.10.11": version "3.10.11" resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.11.tgz#7873648bc83041570d149c234c531639f5346168" @@ -3726,20 +3264,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/tooltip@^3.7.10": - version "3.7.10" - resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.10.tgz#d710532e80337e50be818dfbf2cc54d0a9b8c592" - integrity sha512-Udi3XOnrF/SYIz72jw9bgB74MG/yCOzF5pozHj2FH2HiJlchYv/b6rHByV/77IZemdlkmL/uugrv/7raPLSlnw== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-stately/tooltip" "^3.5.0" - "@react-types/shared" "^3.26.0" - "@react-types/tooltip" "^3.4.13" - "@swc/helpers" "^0.5.0" - -"@react-aria/tooltip@^3.7.11": +"@react-aria/tooltip@^3.7.10", "@react-aria/tooltip@^3.7.11": version "3.7.11" resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.11.tgz#f02822496e77d7bd5664aeda8670e8428288d7e7" integrity sha512-mhZgAWUj7bUWipDeJXaVPZdqnzoBCd/uaEbdafnvgETmov1udVqPTh9w4ZKX2Oh1wa2+OdLFrBOk+8vC6QbWag== @@ -3780,18 +3305,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.26.0": - version "3.26.0" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.26.0.tgz#833cbfa33e75d15835b757791b3f754432d2f948" - integrity sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ== - dependencies: - "@react-aria/ssr" "^3.9.7" - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-aria/utils@^3.27.0": +"@react-aria/utils@^3.26.0", "@react-aria/utils@^3.27.0": version "3.27.0" resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.27.0.tgz#92a58177c60055bb007c2e886d2d914f42df2386" integrity sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw== @@ -3802,19 +3316,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/virtualizer@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@react-aria/virtualizer/-/virtualizer-4.1.0.tgz#df00bfba82fa5e0d622cc24699be67a60be7ab4f" - integrity sha512-ziSq3Y7iuaAMJWGZU1RRs/TykuPapQfx8dyH2eyKPLgEjBUoXRGWE7n6jklBwal14b0lPK0wkCzRoQbkUvX3cg== - dependencies: - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-stately/virtualizer" "^4.2.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/virtualizer@^4.1.1": +"@react-aria/virtualizer@^4.1.0", "@react-aria/virtualizer@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@react-aria/virtualizer/-/virtualizer-4.1.1.tgz#54216b13393a55cf7b73577d9cc039033364d6cb" integrity sha512-AYQmC/S9HhxGOj8HkQdxDW8/+sUEmmfcGpjkInzXB8UZCB1FQLC0LpvA8fOP7AfzLaAL+HVcYF5BvnGMPijHTQ== @@ -3826,17 +3328,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/visually-hidden@^3.8.18": - version "3.8.18" - resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.18.tgz#13c168736944cbe19cd8917ec33a4e6f5f694119" - integrity sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ== - dependencies: - "@react-aria/interactions" "^3.22.5" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/visually-hidden@^3.8.19": +"@react-aria/visually-hidden@^3.8.18", "@react-aria/visually-hidden@^3.8.19": version "3.8.19" resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.19.tgz#4717f6d4333dfa901fa1805c289a025ca0e9dbfc" integrity sha512-MZgCCyQ3sdG94J5iJz7I7Ai3IxoN0U5d/+EaUnA1mfK7jf2fSYQBqi6Eyp8sWUYzBTLw4giXB5h0RGAnWzk9hA== @@ -3993,7 +3485,7 @@ "@react-stately/utils" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@3.6.0", "@react-stately/calendar@^3.6.0": +"@react-stately/calendar@3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.6.0.tgz#c770890160c33826206a015eb7da32fe8ece81d5" integrity sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA== @@ -4004,7 +3496,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@^3.7.0": +"@react-stately/calendar@^3.6.0", "@react-stately/calendar@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.7.0.tgz#2c1391173a077734f74e1e27cab6da333ca1d0e5" integrity sha512-N15zKubP2S7eWfPSJjKVlmJA7YpWzrIGx52BFhwLSQAZcV+OPcMgvOs71WtB7PLwl6DUYQGsgc0B3tcHzzvdvQ== @@ -4015,18 +3507,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@^3.6.10": - version "3.6.10" - resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.10.tgz#69b619fdfcf1e15d2d93392e13289a36d85a8a6c" - integrity sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ== - dependencies: - "@react-stately/form" "^3.1.0" - "@react-stately/utils" "^3.10.5" - "@react-types/checkbox" "^3.9.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/checkbox@^3.6.11": +"@react-stately/checkbox@^3.6.10", "@react-stately/checkbox@^3.6.11": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.11.tgz#91cead7b40a8aa6e198a7191d2ffeb1cdc59054a" integrity sha512-jApdBis+Q1sXLivg+f7krcVaP/AMMMiQcVqcz5gwxlweQN+dRZ/NpL0BYaDOuGc26Mp0lcuVaET3jIZeHwtyxA== @@ -4037,15 +3518,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/collections@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.0.tgz#6240d3517d0d86f7d9eb4997108fb432d569e8d7" - integrity sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA== - dependencies: - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/collections@^3.12.1": +"@react-stately/collections@^3.12.0", "@react-stately/collections@^3.12.1": version "3.12.1" resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.1.tgz#3a0af2555f95c339706a68e51b8f828df5d9ee7f" integrity sha512-8QmFBL7f+P64dEP4o35pYH61/lP0T/ziSdZAvNMrCqaM+fXcMfUp2yu1E63kADVX7WRDsFJWE3CVMeqirPH6Xg== @@ -4053,23 +3526,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/color@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@react-stately/color/-/color-3.8.1.tgz#13969f61f1c1b468fd891cc94582056fc2da9b9b" - integrity sha512-7eN7K+KJRu+rxK351eGrzoq2cG+yipr90i5b1cUu4lioYmcH4WdsfjmM5Ku6gypbafH+kTDfflvO6hiY1NZH+A== - dependencies: - "@internationalized/number" "^3.6.0" - "@internationalized/string" "^3.2.5" - "@react-aria/i18n" "^3.12.4" - "@react-stately/form" "^3.1.0" - "@react-stately/numberfield" "^3.9.8" - "@react-stately/slider" "^3.6.0" - "@react-stately/utils" "^3.10.5" - "@react-types/color" "^3.0.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/color@^3.8.2": +"@react-stately/color@^3.8.1", "@react-stately/color@^3.8.2": version "3.8.2" resolved "https://registry.yarnpkg.com/@react-stately/color/-/color-3.8.2.tgz#7d542d1e45d8fe2f9d590c67d8cfea4315d8002a" integrity sha512-GXwLmv1Eos2OwOiRsGFrXBKx8+uZh2q0qzLZEVYrWsedNhIdTm7nnpwO68nCYZPHkqhv6rhhVSlOOFmDLY++ow== @@ -4084,22 +3541,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.1.tgz#ebae28c5341d06d69cc8e50055fa816dee19522b" - integrity sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/form" "^3.1.0" - "@react-stately/list" "^3.11.1" - "@react-stately/overlays" "^3.6.12" - "@react-stately/select" "^3.6.9" - "@react-stately/utils" "^3.10.5" - "@react-types/combobox" "^3.13.1" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/combobox@^3.10.2": +"@react-stately/combobox@^3.10.1", "@react-stately/combobox@^3.10.2": version "3.10.2" resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.2.tgz#2a6d861d7464f62d82e5f1859bb15e981fd0b0e9" integrity sha512-uT642Dool4tQBh+8UQjlJnTisrJVtg3LqmiP/HqLQ4O3pW0O+ImbG+2r6c9dUzlAnH4kEfmEwCp9dxkBkmFWsg== @@ -4114,15 +3556,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/data@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.12.0.tgz#4f0fd89be2fa64ca7c0ad92d8cf20f2cba961fc0" - integrity sha512-6PiW2oA56lcH1CVjDcajutzsv91w/PER8K61/OGxtNFFUWaIZH80RWmK4kjU/Lf0vygzXCxout3kEb388lUk0w== - dependencies: - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/data@^3.12.1": +"@react-stately/data@^3.12.0", "@react-stately/data@^3.12.1": version "3.12.1" resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.12.1.tgz#d1f3a9e8a80d882d0987f6b99f2a2b37db11a945" integrity sha512-/Nc8X1FmrJ53QU4rN/1i1JtNir4iqo+39Xn5ZOJ74Nng7T+xVVuEuWSo+OEGaycCJf2eZRsomauPxUnnZgCM1A== @@ -4130,7 +3564,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@3.11.0", "@react-stately/datepicker@^3.11.0": +"@react-stately/datepicker@3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.11.0.tgz#5f4daff449f756dc40b4201ae337dd4a3f29facc" integrity sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg== @@ -4144,7 +3578,7 @@ "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@^3.12.0": +"@react-stately/datepicker@^3.11.0", "@react-stately/datepicker@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.12.0.tgz#c9e5d0694a4d8bf0dbb3e795b81dfa0eb5f1e7a2" integrity sha512-AfJEP36d+QgQ30GfacXtYdGsJvqY2yuCJ+JrjHct+m1nYuTkMvMMnhwNBFasgDJPLCDyHzyANlWkl2kQGfsBFw== @@ -4158,16 +3592,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/disclosure@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@react-stately/disclosure/-/disclosure-3.0.0.tgz#6eca061727eb27e391cc09a871f838228c597e14" - integrity sha512-Z9+fi0/41ZXHjGopORQza7mk4lFEFslKhy65ehEo6O6j2GuIV0659ExIVDsmJoJSFjXCfGh0sX8oTSOlXi9gqg== - dependencies: - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/disclosure@^3.0.1": +"@react-stately/disclosure@^3.0.0", "@react-stately/disclosure@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@react-stately/disclosure/-/disclosure-3.0.1.tgz#ea79036cb08e854020856b77be81e3abd99b0700" integrity sha512-afpNy5b0UcqRGjU/W5OD0xkx4PbymvhMrgQZ4o4OdtDVMMvr9T5UqMF8/j3J591DxgQfXM872tJu0kotqT0L6Q== @@ -4176,16 +3601,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/dnd@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.5.0.tgz#3061233709f7113f6492de33204aea507c243a2e" - integrity sha512-ZcWFw1npEDnATiy3TEdzA1skQ3UEIyfbNA6VhPNO8yiSVLxoxBOaEaq8VVS72fRGAtxud6dgOy8BnsP9JwDClQ== - dependencies: - "@react-stately/selection" "^3.18.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/dnd@^3.5.1": +"@react-stately/dnd@^3.5.0", "@react-stately/dnd@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.5.1.tgz#fb2483df0abdb34352a06e36d199c016f315977d" integrity sha512-N18wt6fka9ngJJqxfAzmdtyrk9whAnqWUxZn22CatjNQsqukI4a6KRYwZTXM9x/wm7KamhVOp+GBl85zM8GLdA== @@ -4201,15 +3617,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.0.tgz#7fdb4ca153be18e7516a02e507ada393ad38945d" - integrity sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big== - dependencies: - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/form@^3.1.1": +"@react-stately/form@^3.1.0", "@react-stately/form@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.1.tgz#46980c7b64a785497936a379a67c0dfa8f3c76f7" integrity sha512-qavrz5X5Mdf/Q1v/QJRxc0F8UTNEyRCNSM1we/nnF7GV64+aYSDLOtaRGmzq+09RSwo1c8ZYnIkK5CnwsPhTsQ== @@ -4217,17 +3625,6 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/grid@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.10.0.tgz#d74e46f85a662092c61812a8508cf4ac8721ec6d" - integrity sha512-ii+DdsOBvCnHMgL0JvUfFwO1kiAPP19Bpdpl6zn/oOltk6F5TmnoyNrzyz+2///1hCiySI3FE1O7ujsAQs7a6Q== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/selection" "^3.18.0" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - "@react-stately/grid@^3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.10.1.tgz#2d13d30950a5ae83e15f266ccad710b4dad4a6c5" @@ -4239,20 +3636,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/layout@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-4.1.0.tgz#dd5c376c6dee90922597bcd7af2d7dedfabb6c82" - integrity sha512-pSBqn+4EeOaf2QMK+w2SHgsWKYHdgMZWY3qgJijdzWGZ4JpYmHuiD0yOq80qFdUwxcexPW3vFg3hqIQlMpXeCw== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/table" "^3.13.0" - "@react-stately/virtualizer" "^4.2.0" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@react-types/table" "^3.10.3" - "@swc/helpers" "^0.5.0" - -"@react-stately/layout@^4.1.1": +"@react-stately/layout@^4.1.0", "@react-stately/layout@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-4.1.1.tgz#26e718ad9c1c102ba7d40ceff7ce67264adbf3d5" integrity sha512-kXeo7HKYTOcqMKru1sKFoMoZA+YywSUqHeIA90MptzRugbFhQGq4nUbIYM2p3FeHAX9HU1JAXThuLcwDOHhB8Q== @@ -4265,18 +3649,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.11.1": - version "3.11.1" - resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.1.tgz#d1493e5b9c5cac6cafb3cb3a6edb852bf3cb208f" - integrity sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/selection" "^3.18.0" - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/list@^3.11.2": +"@react-stately/list@^3.11.1", "@react-stately/list@^3.11.2": version "3.11.2" resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.2.tgz#11f1002707dfb54af391a24ca8ef063b6a8cde26" integrity sha512-eU2tY3aWj0SEeC7lH9AQoeAB4LL9mwS54FvTgHHoOgc1ZIwRJUaZoiuETyWQe98AL8KMgR1nrnDJ1I+CcT1Y7g== @@ -4287,17 +3660,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.0.tgz#b1e55996405f4e43ff844cbd325df9842914efe4" - integrity sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ== - dependencies: - "@react-stately/overlays" "^3.6.12" - "@react-types/menu" "^3.9.13" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/menu@^3.9.1": +"@react-stately/menu@^3.9.0", "@react-stately/menu@^3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.1.tgz#fc01957ed8e01e7d85c0b6bd21bc8087b4df59f3" integrity sha512-WRjGGImhQlQaer/hhahGytwd1BDq3fjpTkY/04wv3cQJPJR6lkVI5nSvGFMHfCaErsA1bNyB8/T9Y5F5u4u9ng== @@ -4307,18 +3670,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/numberfield@^3.9.8": - version "3.9.8" - resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.9.8.tgz#863a6c0f7a4249759dd0c586f2e27dd2548aadee" - integrity sha512-J6qGILxDNEtu7yvd3/y+FpbrxEaAeIODwlrFo6z1kvuDlLAm/KszXAc75yoDi0OtakFTCMP6/HR5VnHaQdMJ3w== - dependencies: - "@internationalized/number" "^3.6.0" - "@react-stately/form" "^3.1.0" - "@react-stately/utils" "^3.10.5" - "@react-types/numberfield" "^3.8.7" - "@swc/helpers" "^0.5.0" - -"@react-stately/numberfield@^3.9.9": +"@react-stately/numberfield@^3.9.8", "@react-stately/numberfield@^3.9.9": version "3.9.9" resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.9.9.tgz#a7d2d756aee8dd2df0eb1b0c1ab657148de4a439" integrity sha512-hZsLiGGHTHmffjFymbH1qVmA633rU2GNjMFQTuSsN4lqqaP8fgxngd5pPCoTCUFEkUgWjdHenw+ZFByw8lIE+g== @@ -4329,16 +3681,7 @@ "@react-types/numberfield" "^3.8.8" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.6.12": - version "3.6.12" - resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.12.tgz#beb594a0e140dbd7957bfa181006854f91480bea" - integrity sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw== - dependencies: - "@react-stately/utils" "^3.10.5" - "@react-types/overlays" "^3.8.11" - "@swc/helpers" "^0.5.0" - -"@react-stately/overlays@^3.6.13": +"@react-stately/overlays@^3.6.12", "@react-stately/overlays@^3.6.13": version "3.6.13" resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.13.tgz#37cd757d3404d0fb827216a8e11dbce8ea2186c7" integrity sha512-WsU85Gf/b+HbWsnnYw7P/Ila3wD+C37Uk/WbU4/fHgJ26IEOWsPE6wlul8j54NZ1PnLNhV9Fn+Kffi+PaJMQXQ== @@ -4347,7 +3690,7 @@ "@react-types/overlays" "^3.8.12" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.10.10": +"@react-stately/radio@^3.10.10", "@react-stately/radio@^3.10.9": version "3.10.10" resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.10.tgz#1507265e66ce2d200f0d2127f1659ba0d7f53fba" integrity sha512-9x3bpq87uV8iYA4NaioTTWjriQSlSdp+Huqlxll0T3W3okpyraTTejE91PbIoRTUmL5qByIh2WzxYmr4QdBgAA== @@ -4358,27 +3701,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.10.9": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.9.tgz#cf74b8f47cbef56836424d2e7d06c01fe9d9ea05" - integrity sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw== - dependencies: - "@react-stately/form" "^3.1.0" - "@react-stately/utils" "^3.10.5" - "@react-types/radio" "^3.8.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/searchfield@^3.5.8": - version "3.5.8" - resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.8.tgz#b927e25afd32b1a32f22d54df6d7b4968cb4cf33" - integrity sha512-jtquvGadx1DmtQqPKaVO6Qg/xpBjNxsOd59ciig9xRxpxV+90i996EX1E2R6R+tGJdSM1pD++7PVOO4yE++HOg== - dependencies: - "@react-stately/utils" "^3.10.5" - "@react-types/searchfield" "^3.5.10" - "@swc/helpers" "^0.5.0" - -"@react-stately/searchfield@^3.5.9": +"@react-stately/searchfield@^3.5.8", "@react-stately/searchfield@^3.5.9": version "3.5.9" resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.9.tgz#0e552c1928b9affb6dfd6de280c2d9aca8486b73" integrity sha512-7/aO/oLJ4czKEji0taI/lbHKqPJRag9p3YmRaZ4yqjIMpKxzmJCWQcov5lzWeFhG/1hINKndYlxFnVIKV/urpg== @@ -4387,7 +3710,7 @@ "@react-types/searchfield" "^3.5.11" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.6.10": +"@react-stately/select@^3.6.10", "@react-stately/select@^3.6.9": version "3.6.10" resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.10.tgz#ecfb1fb286f810c05cdd6b5050869ac42316ad03" integrity sha512-V7V0FCL9T+GzLjyfnJB6PUaKldFyT/8Rj6M+R9ura1A0O+s/FEOesy0pdMXFoL1l5zeUpGlCnhJrsI5HFWHfDw== @@ -4399,29 +3722,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.6.9": - version "3.6.9" - resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.9.tgz#088bb0fe7b16cc67d833f17c330df63c4310a5da" - integrity sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg== - dependencies: - "@react-stately/form" "^3.1.0" - "@react-stately/list" "^3.11.1" - "@react-stately/overlays" "^3.6.12" - "@react-types/select" "^3.9.8" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/selection@^3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.18.0.tgz#eb723dc26eafd9b016c55056fb550bdde8b4f87b" - integrity sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/selection@^3.19.0": +"@react-stately/selection@^3.18.0", "@react-stately/selection@^3.19.0": version "3.19.0" resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.19.0.tgz#e81357d94330c06bfc3a842f454be93c5c089b28" integrity sha512-AvbUqnWjqVQC48RD39S9BpMKMLl55Zo5l/yx5JQFPl55cFwe9Tpku1KY0wzt3fXXiXWaqjDn/7Gkg1VJYy8esQ== @@ -4431,17 +3732,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.0.tgz#20439e08915725c4f6ba2285a561ae92fe59d997" - integrity sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag== - dependencies: - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@react-types/slider" "^3.7.7" - "@swc/helpers" "^0.5.0" - -"@react-stately/slider@^3.6.1": +"@react-stately/slider@^3.6.0", "@react-stately/slider@^3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.1.tgz#2e410dd8232aaf74f384616c5af70f375514662c" integrity sha512-8kij5O82Xe233vZZ6qNGqPXidnlNQiSnyF1q613c7ktFmzAyGjkIWVUapHi23T1fqm7H2Rs3RWlmwE9bo2KecA== @@ -4451,22 +3742,7 @@ "@react-types/slider" "^3.7.8" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.13.0.tgz#8465030f568b5ee779623d99b2ef22940a99a6cd" - integrity sha512-mRbNYrwQIE7xzVs09Lk3kPteEVFVyOc20vA8ph6EP54PiUf/RllJpxZe/WUYLf4eom9lUkRYej5sffuUBpxjCA== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/flags" "^3.0.5" - "@react-stately/grid" "^3.10.0" - "@react-stately/selection" "^3.18.0" - "@react-stately/utils" "^3.10.5" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@react-types/table" "^3.10.3" - "@swc/helpers" "^0.5.0" - -"@react-stately/table@^3.13.1": +"@react-stately/table@^3.13.0", "@react-stately/table@^3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.13.1.tgz#dd621097b0c1e74e60509491d960f5d63ada0bf4" integrity sha512-Im8W+F8o9EhglY5kqRa3xcMGXl8zBi6W5phGpAjXb+UGDL1tBIlAcYj733bw8g/ITCnaSz9ubsmON0HekPd6Jg== @@ -4481,17 +3757,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.7.0.tgz#f849b334c5e7d39a37c2e9ffa3114531bf8ce6e4" - integrity sha512-ox4hTkfZCoR4Oyr3Op3rBlWNq2Wxie04vhEYpTZQ2hobR3l4fYaOkd7CPClILktJ3TC104j8wcb0knWxIBRx9w== - dependencies: - "@react-stately/list" "^3.11.1" - "@react-types/shared" "^3.26.0" - "@react-types/tabs" "^3.3.11" - "@swc/helpers" "^0.5.0" - -"@react-stately/tabs@^3.7.1": +"@react-stately/tabs@^3.7.0", "@react-stately/tabs@^3.7.1": version "3.7.1" resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.7.1.tgz#342fac307357c277e9a6e17dba077ea784b8ace2" integrity sha512-gr9ACyuWrYuc727h7WaHdmNw8yxVlUyQlguziR94MdeRtFGQnf3V6fNQG3kxyB77Ljko69tgDF7Nf6kfPUPAQQ== @@ -4501,17 +3767,7 @@ "@react-types/tabs" "^3.3.12" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.0.tgz#39a3e45989f56e236809d8fe69c160cc88a616f5" - integrity sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw== - dependencies: - "@react-stately/utils" "^3.10.5" - "@react-types/checkbox" "^3.9.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/toggle@^3.8.1": +"@react-stately/toggle@^3.8.0", "@react-stately/toggle@^3.8.1": version "3.8.1" resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.1.tgz#3ab375d910f417a57bf457dfb0f1e0dd14d2e7f8" integrity sha512-MVpe79ghVQiwLmVzIPhF/O/UJAUc9B+ZSylVTyJiEPi0cwhbkKGQv9thOF0ebkkRkace5lojASqUAYtSTZHQJA== @@ -4521,16 +3777,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.5.0.tgz#1016952eb4427d5b848e2efcb24eee47e2a26b59" - integrity sha512-+xzPNztJDd2XJD0X3DgWKlrgOhMqZpSzsIssXeJgO7uCnP8/Z513ESaipJhJCFC8fxj5caO/DK4Uu8hEtlB8cQ== - dependencies: - "@react-stately/overlays" "^3.6.12" - "@react-types/tooltip" "^3.4.13" - "@swc/helpers" "^0.5.0" - -"@react-stately/tooltip@^3.5.1": +"@react-stately/tooltip@^3.5.0", "@react-stately/tooltip@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.5.1.tgz#b002cdd7e652c3deaae48daa736f74ad7040f2d4" integrity sha512-0aI3U5kB7Cop9OCW9/Bag04zkivFSdUcQgy/TWL4JtpXidVWmOha8txI1WySawFSjZhH83KIyPc+wKm1msfLMQ== @@ -4539,18 +3786,7 @@ "@react-types/tooltip" "^3.4.14" "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.8.6": - version "3.8.6" - resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.6.tgz#85dc33c5d5b9a455ffc0b474300957e511db1ea4" - integrity sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA== - dependencies: - "@react-stately/collections" "^3.12.0" - "@react-stately/selection" "^3.18.0" - "@react-stately/utils" "^3.10.5" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/tree@^3.8.7": +"@react-stately/tree@^3.8.6", "@react-stately/tree@^3.8.7": version "3.8.7" resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.7.tgz#4eb80212d9dd7c1522d65a14dc039818da690891" integrity sha512-hpc3pyuXWeQV5ufQ02AeNQg/MYhnzZ4NOznlY5OOUoPzpLYiI3ZJubiY3Dot4jw5N/LR7CqvDLHmrHaJPmZlHg== @@ -4568,16 +3804,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-4.2.0.tgz#5906ac9d10ec48bc12a81879991a0b05154605d6" - integrity sha512-aTMpa9AQoz/xLqn8AI1BR/caUUY7/OUo9GbuF434w2u5eGCL7+SAn3Fmq7WSCwqYyDsO+jEIERek4JTX7pEW0A== - dependencies: - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/virtualizer@^4.2.1": +"@react-stately/virtualizer@^4.2.0", "@react-stately/virtualizer@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-4.2.1.tgz#da001c17794ba171c414be44ce95918e3a5fe085" integrity sha512-GHGEXV0ZRhq34U/P3LzkByCBfy2IDynYlV1SE4njkUWWGE/0AH56UegM6w2l3GeiNpXsXCgXl7jpAKeIGMEnrQ== @@ -4603,37 +3830,14 @@ "@react-types/link" "^3.5.10" "@react-types/shared" "^3.27.0" -"@react-types/breadcrumbs@^3.7.9": - version "3.7.9" - resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.9.tgz#c75eae6158bd3631854bff7521c2373b42b0e37c" - integrity sha512-eARYJo8J+VfNV8vP4uw3L2Qliba9wLV2bx9YQCYf5Lc/OE5B/y4gaTLz+Y2P3Rtn6gBPLXY447zCs5i7gf+ICg== - dependencies: - "@react-types/link" "^3.5.9" - "@react-types/shared" "^3.26.0" - -"@react-types/button@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.1.tgz#fc7ada2e83bc661b31c1473a82ec86dc11de057c" - integrity sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA== - dependencies: - "@react-types/shared" "^3.26.0" - -"@react-types/button@^3.10.2": +"@react-types/button@^3.10.1", "@react-types/button@^3.10.2": version "3.10.2" resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.2.tgz#60ce0d4a16690d94a8ae23bb00207c8af9616919" integrity sha512-h8SB/BLoCgoBulCpyzaoZ+miKXrolK9XC48+n1dKJXT8g4gImrficurDW6+PRTQWaRai0Q0A6bu8UibZOU4syg== dependencies: "@react-types/shared" "^3.27.0" -"@react-types/calendar@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.5.0.tgz#a72fa15e08c7785b145005560baa35ad9b44627b" - integrity sha512-O3IRE7AGwAWYnvJIJ80cOy7WwoJ0m8GtX/qSmvXQAjC4qx00n+b5aFNBYAQtcyc3RM5QpW6obs9BfwGetFiI8w== - dependencies: - "@internationalized/date" "^3.6.0" - "@react-types/shared" "^3.26.0" - -"@react-types/calendar@^3.6.0": +"@react-types/calendar@^3.5.0", "@react-types/calendar@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.6.0.tgz#4cfaa261cce621b77ef0705d0f9c07da774a007b" integrity sha512-BtFh4BFwvsYlsaSqUOVxlqXZSlJ6u4aozgO3PwHykhpemwidlzNwm9qDZhcMWPioNF/w2cU/6EqhvEKUHDnFZg== @@ -4641,13 +3845,6 @@ "@internationalized/date" "^3.7.0" "@react-types/shared" "^3.27.0" -"@react-types/checkbox@^3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.9.0.tgz#d4621fef81850543f7a028917e9c2781cd871443" - integrity sha512-9hbHx0Oo2Hp5a8nV8Q75LQR0DHtvOIJbFaeqESSopqmV9EZoYjtY/h0NS7cZetgahQgnqYWQi44XGooMDCsmxA== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/checkbox@^3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.9.1.tgz#6ba0153f3f498af211112eab6e31d243170d5004" @@ -4655,15 +3852,7 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/color@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.1.tgz#42d49736cf606b8434d3fe0ab60b75bb0f44f554" - integrity sha512-KemFziO3GbmT3HEKrgOGdqNA6Gsmy9xrwFO3f8qXSG7gVz6M27Ic4R9HVQv4iAjap5uti6W13/pk2bc/jLVcEA== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/slider" "^3.7.7" - -"@react-types/color@^3.0.2": +"@react-types/color@^3.0.1", "@react-types/color@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.2.tgz#e8a1a3be5689e3c128d50a4d30f5bbb2d46d88e9" integrity sha512-4k9c0l5SACwTtkHV0dQ0GrF0Kktk/NChkxtyu58BamyUQOsCe8sqny+uul2nPrqQvuVof/dkRjKhv/DVyyx2mw== @@ -4671,13 +3860,6 @@ "@react-types/shared" "^3.27.0" "@react-types/slider" "^3.7.8" -"@react-types/combobox@^3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.1.tgz#d7d843f45501ad141f74ba62ed46d2e991b2d6a0" - integrity sha512-7xr+HknfhReN4QPqKff5tbKTe2kGZvH+DGzPYskAtb51FAAiZsKo+WvnNAvLwg3kRoC9Rkn4TAiVBp/HgymRDw== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/combobox@^3.13.2": version "3.13.2" resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.2.tgz#b6ee140166691e59bebe57f082dc6127f9bb7210" @@ -4685,7 +3867,7 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/datepicker@^3.10.0": +"@react-types/datepicker@^3.10.0", "@react-types/datepicker@^3.9.0": version "3.10.0" resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.10.0.tgz#4557c2d22a52fb7340ca27e6eba4d23556684e84" integrity sha512-Att7y4NedNH1CogMDIX9URXgMLxGbZgnFCZ8oxgFAVndWzbh3TBcc4s7uoJDPvgRMAalq+z+SrlFFeoBeJmvvg== @@ -4695,25 +3877,7 @@ "@react-types/overlays" "^3.8.12" "@react-types/shared" "^3.27.0" -"@react-types/datepicker@^3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.9.0.tgz#86e2a4e23e9fbf8299a12bd8aba9b1a52cf44725" - integrity sha512-dbKL5Qsm2MQwOTtVQdOcKrrphcXAqDD80WLlSQrBLg+waDuuQ7H+TrvOT0thLKloNBlFUGnZZfXGRHINpih/0g== - dependencies: - "@internationalized/date" "^3.6.0" - "@react-types/calendar" "^3.5.0" - "@react-types/overlays" "^3.8.11" - "@react-types/shared" "^3.26.0" - -"@react-types/dialog@^3.5.14": - version "3.5.14" - resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.14.tgz#97e568dc38ede4312ba6a12eda855c5e32c7cd47" - integrity sha512-OXWMjrALwrlgw8aHD8SeRm/s3tbAssdaEh2h73KUSeFau3fU3n5mfKv+WnFqsEaOtN261o48l7hTlS6615H9AA== - dependencies: - "@react-types/overlays" "^3.8.11" - "@react-types/shared" "^3.26.0" - -"@react-types/dialog@^3.5.15": +"@react-types/dialog@^3.5.14", "@react-types/dialog@^3.5.15": version "3.5.15" resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.15.tgz#abf7c16c41808b80ac7300f9dc4a8a1ba72020ee" integrity sha512-BX1+mV35Oa0aIlhu98OzJaSB7uiCWDPQbr0AkpFBajSSlESUoAjntN+4N+QJmj24z2v6UE9zxGQ85/U/0Le+bw== @@ -4721,28 +3885,14 @@ "@react-types/overlays" "^3.8.12" "@react-types/shared" "^3.27.0" -"@react-types/form@^3.7.8": - version "3.7.8" - resolved "https://registry.yarnpkg.com/@react-types/form/-/form-3.7.8.tgz#4d6b9e78770b9345cc9e1041990a7a26fb65e0ee" - integrity sha512-0wOS97/X0ijTVuIqik1lHYTZnk13QkvMTKvIEhM7c6YMU3vPiirBwLbT2kJiAdwLiymwcCkrBdDF1NTRG6kPFA== - dependencies: - "@react-types/shared" "^3.26.0" - -"@react-types/form@^3.7.9": +"@react-types/form@^3.7.8", "@react-types/form@^3.7.9": version "3.7.9" resolved "https://registry.yarnpkg.com/@react-types/form/-/form-3.7.9.tgz#e2676c7edf66f71f1dfa676ce95e4fc8aab5a049" integrity sha512-+qGDrQFdIh8umU82zmnYJ0V2rLoGSQ3yApFT02URz//NWeTA7qo0Oab2veKvXUkcBb47oSvytZYmkExPikxIEg== dependencies: "@react-types/shared" "^3.27.0" -"@react-types/grid@^3.2.10": - version "3.2.10" - resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.10.tgz#d2d1d124ed9472e3dedc48e91c941a7ad23bdc83" - integrity sha512-Z5cG0ITwqjUE4kWyU5/7VqiPl4wqMJ7kG/ZP7poAnLmwRsR8Ai0ceVn+qzp5nTA19cgURi8t3LsXn3Ar1FBoog== - dependencies: - "@react-types/shared" "^3.26.0" - -"@react-types/grid@^3.2.11": +"@react-types/grid@^3.2.10", "@react-types/grid@^3.2.11": version "3.2.11" resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.11.tgz#0609807fde54356e3ff99a3b6df5859afed5e517" integrity sha512-Mww9nrasppvPbsBi+uUqFnf7ya8fXN0cTVzDNG+SveD8mhW+sbtuy+gPtEpnFD2Oyi8qLuObefzt4gdekJX2Yw== @@ -4756,20 +3906,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/link@^3.5.9": - version "3.5.9" - resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.9.tgz#bf61ff2780581de03920e6e43260844a81a38d2f" - integrity sha512-JcKDiDMqrq/5Vpn+BdWQEuXit4KN4HR/EgIi3yKnNbYkLzxBoeQZpQgvTaC7NEQeZnSqkyXQo3/vMUeX/ZNIKw== - dependencies: - "@react-types/shared" "^3.26.0" - -"@react-types/listbox@^3.5.3": - version "3.5.3" - resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.5.3.tgz#c5dbe8a67d67ca59de6b88aaa2f20fcf61fee1c5" - integrity sha512-v1QXd9/XU3CCKr2Vgs7WLcTr6VMBur7CrxHhWZQQFExsf9bgJ/3wbUdjy4aThY/GsYHiaS38EKucCZFr1QAfqA== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/listbox@^3.5.4": version "3.5.4" resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.5.4.tgz#71de93319e508a38a073e5cc9ffcaa01d7fb02e7" @@ -4777,14 +3913,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/menu@^3.9.13": - version "3.9.13" - resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.13.tgz#a666c2233cbdb495202586df86a798601788f74d" - integrity sha512-7SuX6E2tDsqQ+HQdSvIda1ji/+ujmR86dtS9CUu5yWX91P25ufRjZ72EvLRqClWNQsj1Xl4+2zBDLWlceznAjw== - dependencies: - "@react-types/overlays" "^3.8.11" - "@react-types/shared" "^3.26.0" - "@react-types/menu@^3.9.14": version "3.9.14" resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.14.tgz#524d173ad2d79bf9deeffd7de2af8a9839f9a212" @@ -4793,13 +3921,6 @@ "@react-types/overlays" "^3.8.12" "@react-types/shared" "^3.27.0" -"@react-types/meter@^3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.4.5.tgz#e06d4a2fabd24989c73541b032123c5de495b613" - integrity sha512-04w1lEtvP/c3Ep8ND8hhH2rwjz2MtQ8o8SNLhahen3u0rX3jKOgD4BvHujsyvXXTMjj1Djp74sGzNawb4Ppi9w== - dependencies: - "@react-types/progress" "^3.5.8" - "@react-types/meter@^3.4.6": version "3.4.6" resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.4.6.tgz#c57bfb6b7ab3e34575474332edaa2999c4eeb676" @@ -4807,13 +3928,6 @@ dependencies: "@react-types/progress" "^3.5.9" -"@react-types/numberfield@^3.8.7": - version "3.8.7" - resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.8.7.tgz#5a697fdf1bc405dbf55dafed713d47ed79f8e54b" - integrity sha512-KccMPi39cLoVkB2T0V7HW6nsxQVAwt89WWCltPZJVGzsebv/k0xTQlPVAgrUake4kDLoE687e3Fr/Oe3+1bDhw== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/numberfield@^3.8.8": version "3.8.8" resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.8.8.tgz#7134dc8e40ebeb493be7badc28648a11b6186f16" @@ -4821,13 +3935,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/overlays@^3.8.11": - version "3.8.11" - resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.11.tgz#313964703b2a23572138120b619d35da33445dfd" - integrity sha512-aw7T0rwVI3EuyG5AOaEIk8j7dZJQ9m34XAztXJVZ/W2+4pDDkLDbJ/EAPnuo2xGYRGhowuNDn4tDju01eHYi+w== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/overlays@^3.8.12": version "3.8.12" resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.12.tgz#0cd1ee17e6eacc33899821ab34045fc396898c22" @@ -4835,13 +3942,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/progress@^3.5.8": - version "3.5.8" - resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.8.tgz#62ce4207c7e8d640b794c6d89063ce21bdb5970d" - integrity sha512-PR0rN5mWevfblR/zs30NdZr+82Gka/ba7UHmYOW9/lkKlWeD7PHgl1iacpd/3zl/jUF22evAQbBHmk1mS6Mpqw== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/progress@^3.5.9": version "3.5.9" resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.9.tgz#aab7a20f361d970e5e847fedbe4306557cde0bad" @@ -4849,13 +3949,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/radio@^3.8.5": - version "3.8.5" - resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.5.tgz#8e2dd1911fba829b7f1ebb40bccf9ca483f021fc" - integrity sha512-gSImTPid6rsbJmwCkTliBIU/npYgJHOFaI3PNJo7Y0QTAnFelCtYeFtBiWrFodSArSv7ASqpLLUEj9hZu/rxIg== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/radio@^3.8.6": version "3.8.6" resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.6.tgz#e3721f47fdbcc56a6c912870c0676edb146bc822" @@ -4863,14 +3956,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/searchfield@^3.5.10": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.10.tgz#015a42bf8417618b848035b88f0aba98572beceb" - integrity sha512-7wW4pJzbReawoGPu8a4l+CODTCDN088EN/ysUzl622ewim57PjArjix+lpO4+aEtJqS9HKpq8UEbjwo9axpcUA== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/textfield" "^3.10.0" - "@react-types/searchfield@^3.5.11": version "3.5.11" resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.11.tgz#b15872853ef0908c1b0d81fcb40df50e60600f58" @@ -4879,13 +3964,6 @@ "@react-types/shared" "^3.27.0" "@react-types/textfield" "^3.11.0" -"@react-types/select@^3.9.8": - version "3.9.8" - resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.8.tgz#2443b82549b65821f85876a5b803e6d04ae6343e" - integrity sha512-RGsYj2oFjXpLnfcvWMBQnkcDuKkwT43xwYWZGI214/gp/B64tJiIUgTM5wFTRAeGDX23EePkhCQF+9ctnqFd6g== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/select@^3.9.9": version "3.9.9" resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.9.tgz#adb771b5152be664e0e3011dad60cc4a3258c66d" @@ -4893,23 +3971,11 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/shared@^3.26.0": - version "3.26.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.26.0.tgz#21a8b579f0097ee78de18e3e580421ced89e4c8c" - integrity sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw== - -"@react-types/shared@^3.27.0": +"@react-types/shared@^3.26.0", "@react-types/shared@^3.27.0": version "3.27.0" resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.27.0.tgz#167c163139efc98c2194aba090076c03b658c07d" integrity sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw== -"@react-types/slider@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.7.tgz#f00450c6268665ff2ad38ad69bdf51d84ff2341a" - integrity sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/slider@^3.7.8": version "3.7.8" resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.8.tgz#a844b81a67171931352d3b5fb40ae87290b99097" @@ -4917,13 +3983,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/switch@^3.5.7": - version "3.5.7" - resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.7.tgz#f3fb589fce5819ca1c15f12479bf348e053adc27" - integrity sha512-1IKiq510rPTHumEZuhxuazuXBa2Cuxz6wBIlwf3NCVmgWEvU+uk1ETG0sH2yymjwCqhtJDKXi+qi9HSgPEDwAg== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/switch@^3.5.8": version "3.5.8" resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.8.tgz#fd2d2c7fab236d3daaca57cfe34b3ec37cb0fef5" @@ -4931,15 +3990,7 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/table@^3.10.3": - version "3.10.3" - resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.3.tgz#33959348641500e406abe330074f84b0c75ae4ac" - integrity sha512-Ac+W+m/zgRzlTU8Z2GEg26HkuJFswF9S6w26r+R3MHwr8z2duGPvv37XRtE1yf3dbpRBgHEAO141xqS2TqGwNg== - dependencies: - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - -"@react-types/table@^3.10.4": +"@react-types/table@^3.10.3", "@react-types/table@^3.10.4": version "3.10.4" resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.4.tgz#1ad302f78625c864bc8fd7fa95d839e50efdec15" integrity sha512-d0tLz/whxVteqr1rophtuuxqyknHHfTKeXrCgDjt8pAyd9U8GPDbfcFSfYPUhWdELRt7aLVyQw6VblZHioVEgQ== @@ -4947,13 +3998,6 @@ "@react-types/grid" "^3.2.11" "@react-types/shared" "^3.27.0" -"@react-types/tabs@^3.3.11": - version "3.3.11" - resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.11.tgz#b7db710ce2ca42a4e72cd2a581070212d2b07793" - integrity sha512-BjF2TqBhZaIcC4lc82R5pDJd1F7kstj1K0Nokhz99AGYn8C0ITdp6lR+DPVY9JZRxKgP9R2EKfWGI90Lo7NQdA== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/tabs@^3.3.12": version "3.3.12" resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.12.tgz#7cd69dae549136ede13f35878e65ccff7bb4522f" @@ -4961,13 +4005,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/textfield@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.10.0.tgz#10df39b75334174490a539ecae71ad19f5ea074d" - integrity sha512-ShU3d6kLJGQjPXccVFjM3KOXdj3uyhYROqH9YgSIEVxgA9W6LRflvk/IVBamD9pJYTPbwmVzuP0wQkTDupfZ1w== - dependencies: - "@react-types/shared" "^3.26.0" - "@react-types/textfield@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.11.0.tgz#09d1fb2dbc24795b22008d27490b1620e6d68c01" @@ -4975,14 +4012,6 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/tooltip@^3.4.13": - version "3.4.13" - resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.13.tgz#f73fdc5c56790b7bd7c0d5382d0c758bd659e9d7" - integrity sha512-KPekFC17RTT8kZlk7ZYubueZnfsGTDOpLw7itzolKOXGddTXsrJGBzSB4Bb060PBVllaDO0MOrhPap8OmrIl1Q== - dependencies: - "@react-types/overlays" "^3.8.11" - "@react-types/shared" "^3.26.0" - "@react-types/tooltip@^3.4.14": version "3.4.14" resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.14.tgz#7acc4247f9bcb30e50fc4c18e8b3fda17e52d85c" @@ -5069,9 +4098,9 @@ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@rushstack/eslint-patch@^1.10.3": - version "1.10.4" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" - integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== + version "1.10.5" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz#3a1c12c959010a55c17d46b395ed3047b545c246" + integrity sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A== "@sentry-internal/browser-utils@8.52.0": version "8.52.0" @@ -5296,61 +4325,61 @@ unplugin "1.0.1" uuid "^9.0.0" -"@shikijs/core@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.25.1.tgz#77d5af5e759c7b12abb00785a8e2ef64fe949b2f" - integrity sha512-0j5k3ZkLTQViOuNzPVyWGoW1zgH3kiFdUT/JOCkTm7TU74mz+dF+NID+YoiCBzHQxgsDpcGYPjKDJRcuVLSt4A== +"@shikijs/core@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.29.1.tgz#45527f431ab10ee20b999b1a8f2fe6d4f43fc651" + integrity sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A== dependencies: - "@shikijs/engine-javascript" "1.25.1" - "@shikijs/engine-oniguruma" "1.25.1" - "@shikijs/types" "1.25.1" - "@shikijs/vscode-textmate" "^9.3.1" + "@shikijs/engine-javascript" "1.29.1" + "@shikijs/engine-oniguruma" "1.29.1" + "@shikijs/types" "1.29.1" + "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.25.1.tgz#ebae27e6949a9d3aa46a86b596a762933db4a2ea" - integrity sha512-zQ7UWKnRCfD/Q1M+XOSyjsbhpE0qv8LUnmn82HYCeOsgAHgUZGEDIQ63bbuK3kU5sQg+2CtI+dPfOqD/mjSY9w== +"@shikijs/engine-javascript@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.29.1.tgz#6db5b88ca9aa8937c6f7d9489395de5d0eb71031" + integrity sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q== dependencies: - "@shikijs/types" "1.25.1" - "@shikijs/vscode-textmate" "^9.3.1" - oniguruma-to-es "0.10.0" + "@shikijs/types" "1.29.1" + "@shikijs/vscode-textmate" "^10.0.1" + oniguruma-to-es "^2.2.0" -"@shikijs/engine-oniguruma@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.25.1.tgz#537221149f47fd71f64a503203c4bd3fd037fa02" - integrity sha512-iKPMh3H+0USHtWfZ1irfMTH6tGmIUFSnqt3E2K8BgI1VEsqiPh0RYkG2WTwzNiM1/WHN4FzYx/nrKR7PDHiRyw== +"@shikijs/engine-oniguruma@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz#118de735cb4e5a07d8792969342b988d2cfda01c" + integrity sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw== dependencies: - "@shikijs/types" "1.25.1" - "@shikijs/vscode-textmate" "^9.3.1" + "@shikijs/types" "1.29.1" + "@shikijs/vscode-textmate" "^10.0.1" -"@shikijs/langs@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.25.1.tgz#1c0b7822d41929351b31409d2932952495a4fae3" - integrity sha512-hdYjq9aRJplAzGe2qF51PR9IDgEoyGb4IkXvr3Ts6lEdg4Z8M/kdknKRo2EIuv3IR/aKkJXTlBQRM+wr3t20Ew== +"@shikijs/langs@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.29.1.tgz#ea96bc8ce777ccb105ba01331e8b6ce56f01146c" + integrity sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw== dependencies: - "@shikijs/types" "1.25.1" + "@shikijs/types" "1.29.1" -"@shikijs/themes@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.25.1.tgz#7b38ad054632521e883bcf44fb96181151dea5a9" - integrity sha512-JO0lDn4LgGqg5QKvgich5ScUmC2okK+LxM9a3iLUH7YMeI2c8UGXThuJv6sZduS7pdJbYQHPrvWq9t/V4GhpbQ== +"@shikijs/themes@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.29.1.tgz#d2d77705aa94c6523aaf93f9e4bcaad2c0ccc242" + integrity sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g== dependencies: - "@shikijs/types" "1.25.1" + "@shikijs/types" "1.29.1" -"@shikijs/types@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.25.1.tgz#b080fc9e2622b0e4b2ec0ff4bc0628a37f7fc102" - integrity sha512-dceqFUoO95eY4tpOj3OGq8wE8EgJ4ey6Me1HQEu5UbwIYszFndEll/bjlB8Kp9wl4fx3uM7n4+y9XCYuDBmcXA== +"@shikijs/types@1.29.1": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.1.tgz#41f05dac7203f64ac0ac3c4b7dc75cb6b85f76f5" + integrity sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA== dependencies: - "@shikijs/vscode-textmate" "^9.3.1" + "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" -"@shikijs/vscode-textmate@^9.3.1": - version "9.3.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz#afda31f8f42cab70a26f3603f52eae3f1c35d2f7" - integrity sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g== +"@shikijs/vscode-textmate@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" + integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -5582,115 +4611,115 @@ integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== "@tiptap/core@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.11.0.tgz#72891ae9b3e4b2a67f79ab3bcb14483d30a9bd8a" - integrity sha512-0S3AWx6E2QqwdQqb6z0/q6zq2u9lA9oL3BLyAaITGSC9zt8OwjloS2k1zN6wLa9hp2rO0c0vDnWsTPeFaEaMdw== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.11.3.tgz#2fec77ff3d6fdfabbc5ce1a2cab65c5c759a9a01" + integrity sha512-ibfi6U1gMRLo319Re6olv8uAuxtUpK343ygcVoZrJ8O4sqRnU9CEqPAM+n7YAKlOks1+Di0sTheIxZRak7Pj4g== "@tiptap/extension-bold@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.11.0.tgz#170e04df4396f3a3b830e34055b3a87f4e42a3b6" - integrity sha512-3x9BQZHYD5xFA0pCEneEMHZyIoxYo4NKcbhR4CLxGad1Xd+5g109nr1+eZ1JgvnChkeVf1eD6SaQE2A28lxR5g== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.11.3.tgz#c1e0e6ab399b0cc04d2678bf2852559d20112df5" + integrity sha512-YafJ+BavtzQBir81HoM62G0cik1ww7zNcElkg35sQWtVFnT99s+fLEuSurixtmiLdgmSSb/YsPrCmNp/R75zOw== -"@tiptap/extension-bubble-menu@^2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.0.tgz#f2f596d01d24312962bd9c14a1c1a797931cf221" - integrity sha512-21KyB7+QSQjw72Oxzs3Duw9WErAUrigFZCyoCZNjp24wP7mFVsy1jAcnRiAi8pBVwlwHBZ29IW1PeavqCSFFVA== +"@tiptap/extension-bubble-menu@^2.11.3": + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.3.tgz#c631acf804b6aa1233a4e37b7895d1d4d2b7e5b0" + integrity sha512-KOAy9zCzqssJO7cGIwZNgv2hFyxrZ2AHoWptICPA79nVZrHQQw2ZP1/FDTR8cDEZzLQMbpgGqQhUhjZcAs3/zQ== dependencies: tippy.js "^6.3.7" "@tiptap/extension-code@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.11.0.tgz#eaf3a0a63ceeda462d1526e40a221223c7497b54" - integrity sha512-2roNZxcny1bGjyZ8x6VmGTuKbwfJyTZ1hiqPc/CRTQ1u42yOhbjF4ziA5kfyUoQlzygZrWH9LR5IMYGzPQ1N3w== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.11.3.tgz#488227e4dee250afb40f05f90c87f4ad9cb0d583" + integrity sha512-w36Pb4DlB/cQZwsIpd5pSDwYuLBBSGh6dwGc9TVUdv+hdh8vIsnkGCjynapXgUrT2RFEJwObRYK+r5Gw84uGSA== "@tiptap/extension-collaboration-cursor@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.11.0.tgz#14f60c6d7774aa104dbc8b137320638a05ce0110" - integrity sha512-JZx9SWOxEYQIGaJKndsCPdQas8hniodSsfAFjJq1X62nl7Hlif//mrjAU8c5gRCd7KtTxf/Q8Y7cClLdfkjQmQ== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.11.3.tgz#ba588e7571264610c825ed352213d98f836c5864" + integrity sha512-Hw6ByVzE8KiuPqSC3BTFDFIidrtlyrJnJJ9Ff3PCMgloLz89H910yvWyAXnw8OhlzdZBRVdWML53kVS+402suw== "@tiptap/extension-collaboration@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration/-/extension-collaboration-2.11.0.tgz#21ac1c8bc2ca6d8ba2a838e63457528627294888" - integrity sha512-pS3E//ODD80PwVXp7zOqek0q9z5AtZ6sMSK5nPneNioe7dSvCeQzToOD9V6EevK4KChUIN9wEryK8mkQs57ioA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration/-/extension-collaboration-2.11.3.tgz#9a9b069ebb35534be226c3ac65f5458a5d8201b3" + integrity sha512-2zZrd1pA3jDhMiqlFUSewPvwSnFjjaA7+sjulQO49HCZykyqdR1Fd5cxNKKBsjMczZfR7mop8I/NANeSZyRGmg== -"@tiptap/extension-floating-menu@^2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.0.tgz#fa96fc2a75d94d2e21f4a6ed6b9fedd53d344a4a" - integrity sha512-dexhhUJm0x9OolbeVCa7RpxuALU3bJZC7dFpu/rPG3ZetXKhVw8hTrqUQD5w1DjXpczBzScnLgLrvnjxbG66pw== +"@tiptap/extension-floating-menu@^2.11.3": + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.3.tgz#bbfc743740aeecd4c36ecf072aa0e54ca59016d0" + integrity sha512-Za1x475cvv+URegCsoDr8rZI5GIoC4N6rHg/xqmozY4bA326Ko1cMrUbwpVF6p17nerDGAMCIstZM7SSUQdNSA== dependencies: tippy.js "^6.3.7" "@tiptap/extension-gapcursor@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.0.tgz#01511c996656c43ed008825b66ccdf9fa365a674" - integrity sha512-1TVOthPkUYwTQnQwP0BzuIHVz09epOiXJQ3GqgNZsmTehwcMzz2vGCpx1JXhZ5DoMaREHNLCdraXb1n2FdhDNA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.3.tgz#c01b6ee8069cc910d827d0b63d267f02cdd0ebfd" + integrity sha512-QNVoMNvsinnpvIBAADCbPXMAxY6nv38dxLY3mmPBF0j51H1ggGRX2MdD8VsSBM+AP5az9vTa1+rO+0wBfDwDWw== "@tiptap/extension-hard-break@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.11.0.tgz#0e199a1c58171fe1879e730b87666e759fe55c04" - integrity sha512-7pMgPNk2FnPT0LcWaWNNxOLK3LQnRSYFgrdBGMXec3sy+y3Lit3hM+EZhbZcHpTIQTbWWs+eskh1waRMIt0ZaQ== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.11.3.tgz#c02749d74166b6acadf6104e3b60e2fa1dad93c7" + integrity sha512-Jsz1qV/h4GFZiBtcrJ2yAF1Euw25IXgx5m4EBr/33TV6gT5+zRUr4e0y6h3jHicyInviZeXd9HXELCcQCEtHRg== "@tiptap/extension-history@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.11.0.tgz#fc04cb418e4bad6c659b101d48812e43f04c3bbc" - integrity sha512-eEUEDoOtS17AHVEPbGfZ+x2L5A87SiIsppWYTkpfIH/8EnVQmzu+3i1tcT9cWvHC31d9JTG7TDptVuuHr30TJw== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.11.3.tgz#341c9a07b293c5904b195de41997fa48decab31d" + integrity sha512-dxJeuGuLEn9V4iGfsvMOBcTwufcw971NoBdsyW1TOzYvucDkYHgIlOVE4DEWIVuOkfIjKEiCGl8IdZLaHWU8Sg== "@tiptap/extension-horizontal-rule@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.0.tgz#ba7dc213f93cf3920ebcff246a8aaf845cb0b683" - integrity sha512-ZbkILwmcccmwQB2VTA/dzHRMB+xoJQ8UJdafcUiaAUlQfvDgl898+AYMa2GRTZkLPvzCKjXMC9hybSyy54Lz3Q== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.3.tgz#28bf66d6dd02584239430ef01978b11bea380a0a" + integrity sha512-+O6W6EbD4TLsUF8t0ApgZWLpcwn3tajRZtBU6u0SuwHtvhMTrQYySUTH5j06KfTDbw6JAqKKPCpKhPgH2Z6eFg== "@tiptap/extension-italic@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.11.0.tgz#fe36d1aac51d8d5f8c276116a1e4408396440d8e" - integrity sha512-T+jjS0gOsvNzQXVTSArmUp/kt2R9OikPQaV1DI60bfjO0rknOgtG0tbwZmfbugzwc07RbpxOYFy3vBxMLDsksA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.11.3.tgz#34a4373ca0b99c36e905fe12f9e5545e8a9a680e" + integrity sha512-GpeQh2tMb6ys/ft7xqitoXeWO7uM8z4hvLEhD92ACuk6VpcHUhksUwnv4G4Qc/cZ9i+qk3GYEsRha0JaHp3GVw== "@tiptap/extension-link@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.11.0.tgz#f2093ba758201304637a88256c5a388c8acf035a" - integrity sha512-hvJSj0Ul4h8uxivtFtqaSy08s9G3smaW0He0ybYJ7rcJIsZ1zSrxQLGvIr/J8/yUq8VoVNspNR5cGUoyQaaw4A== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.11.3.tgz#31d4d37084c0261c96a1187c11b45938936a02b9" + integrity sha512-FPLLBPqJQmqVMww7qx+Oznru2OaeoeZ6wTSfwtZZv1jNa1wwtK9O0wRJ3g71qvdFAt1veOesZNiMn3q7MOrw0A== dependencies: linkifyjs "^4.2.0" "@tiptap/extension-paragraph@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.11.0.tgz#936bfbc6781acd5ac0dba6bcdc2fa67514ce6164" - integrity sha512-xLNC05An3SQq0bVHJtOTLa8As5r6NxDZFpK0NZqO2hTq/fAIRL/9VPeZ8E0tziXULwIvIPp+L0Taw3TvaUkRUg== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.11.3.tgz#9e050b6de59069d5c9ec0509679d3947ac143288" + integrity sha512-snH9aIRJGpHCLm0zzuBwhXpRYMyZvyNBlF5MulJKxkwremFhD9fVP26UtQEneL/CnwpNs3q1QOQGTRlqFP2hbg== "@tiptap/extension-strike@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.11.0.tgz#8507cfb501f4950d869f8ddd1adb47b66680765f" - integrity sha512-71i2IZT58kY2ohlhyO+ucyAioNNCkNkuPkrVERc9lXhmcCKOff5y6ekDHQHO2jNjnejkVE5ibyDO3Z7RUXjh1A== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.11.3.tgz#2c8f16b4900c5bc7468e5318d72b4c2489695170" + integrity sha512-Ei4rGEqytwXSj4Th1CN8EZFHnYmM5lAp8YUj1V3wWGX7EtRtnq1YG3+b7q68NKmdPSMFOjEz6pHtBzO+p+0aWw== "@tiptap/extension-table-cell@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.11.0.tgz#439ae8c348d52651afa0d9df92c5e191e0dc8e09" - integrity sha512-05lXXaGPWzVi/mVYRzsiLbaZ1VVU42buCkoTZrduvJsGEu6K+Cut2fqo7I29CJmJ0P/hDSyMEJDKqdKSP9xalA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.11.3.tgz#322b0eb6eeb8f655442b86543a446815c490f6eb" + integrity sha512-evdzllWjBey8bzSR7sUxTdrHKjN6M3XOv+1XfaoQpqMr8ryRWDb6yPSEIssAjc8bIa7yvCl7jaXMreeXE7oBSQ== "@tiptap/extension-table-header@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.11.0.tgz#1f38080f33d720095439bff2482cbfed3b6607d7" - integrity sha512-pOKz1E7VT9v37psA0lFJ0mcj2DAa/KNqNqO3TGOUnNOYaN+/6w01i6tA7rAinULsxaFTZx5x1BGLMqonc6n0fw== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.11.3.tgz#f849687a05fb9668398d84864ba6623b5a890f7e" + integrity sha512-Dcs7R0r5VDhuRvEfLhUKFvK9Yj2xPP8aTQ2UvLVCUJMlvo5Qv/xaJWDbXxH/AQ3wL4LvZomHTOWvdNad7WEkgg== "@tiptap/extension-table-row@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.11.0.tgz#f038f93a91c08210886ca2128027a36b0a1902c6" - integrity sha512-j+o5Lr1JynSWcd/NN+4mNELvcVwj6CxcNT3J37oc5uy0a6CBhHlmp1d9eEbEnk95tMEsibunVV73wRqE150nEw== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.11.3.tgz#e09547959a50a7992ad192cf34aca4e5ed635961" + integrity sha512-ExCsW/7SFJ9geXhEBKb3eyLCvUOvfLC6pn69aua/AvXPJE4cv//5D42e6o5Iyu/xwLLPH1oAINa0HYmsFDp75w== "@tiptap/extension-text@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.11.0.tgz#56ad3d9b14a34f67f7f8b82a499ef7a9a10ef0a6" - integrity sha512-LcyrP+7ZEVx3YaKzjMAeujq+4xRt4mZ3ITGph2CQ4vOKFaMI8bzSR909q18t7Qyyvek0a9VydEU1NHSaq4G5jw== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.11.3.tgz#5c5b660ed894d2d7455781abc2683d48afceb972" + integrity sha512-DhrwR9tmDU2U4yjqdaX6odrnOYaE/Ai2ERs2bU4Sgm0ZF5QCyO31Cflg1OQ4erTi0IiqD5ilDPRXqFuu6FGzOQ== "@tiptap/extension-underline@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.11.0.tgz#473025d3ed01953fb2c23f8060ea90be4c231faa" - integrity sha512-DE1piq441y1+9Aj1pvvuq1dcc5B2HZ2d1SPtO4DTMjCxrhok12biTkMxxq0q1dzA5/BouLlUW6WTPpinhmrUWA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.11.3.tgz#4b4d7d1c0b0215afbcab78c02d83811815b04c38" + integrity sha512-OPVG+D6byOn7mLTOwYVCIQL6j32SlYgic+Ku3km4qadynfqhHcALpmhMkWXcrlA7S9R7aIP2s5XW73dV//XCyQ== "@tiptap/pm@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.11.0.tgz#c2ccb0c9b99fd5915d9390e90d3ab9e5fb408cd8" - integrity sha512-4RU6bpODkMY+ZshzdRFcuUc5jWlMW82LWXR6UOsHK/X/Mav41ZFS0Cyf+hQM6gxxTB09YFIICmGpEpULb+/CuA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.11.3.tgz#90a5ad7e2d49c60348b3c7bae0a24a9cbf463edb" + integrity sha512-AEpiWvYmXdELpuGGhX6lS2aU155ANwS7WbQ/+/SFqH3YIYHjgUzP8UnY6KSiEBI7a7kX4TWhG84mWrzPA3dPaw== dependencies: prosemirror-changeset "^2.2.1" prosemirror-collab "^1.3.1" @@ -5712,12 +4741,12 @@ prosemirror-view "^1.37.0" "@tiptap/react@^2.7.1": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.11.0.tgz#28b9ca64bdeb6302eaca1941ef792e3acea2e40e" - integrity sha512-AALzHbqNq/gerJpkbXmN2OXFmHAs2bQENH7rXbnH70bpxVdIfQVtvjK4dIb+cQQvAuTWZvhsISnTrFY2BesT3Q== + version "2.11.3" + resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.11.3.tgz#82a4f2b4eaa45ce9170c85de1888d8152ca022b8" + integrity sha512-tNY/xJ7swV1Ffc6W5CSEWJnBo3grDapkZnd2udSTJ7/zYMUe+vSN2bcdKga2Zo2rAC0WFuLUl27iUhrZ29FFuQ== dependencies: - "@tiptap/extension-bubble-menu" "^2.11.0" - "@tiptap/extension-floating-menu" "^2.11.0" + "@tiptap/extension-bubble-menu" "^2.11.3" + "@tiptap/extension-floating-menu" "^2.11.3" "@types/use-sync-external-store" "^0.0.6" fast-deep-equal "^3" use-sync-external-store "^1" @@ -5858,9 +4887,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.3.tgz#04174d3f0836863467b7fbcbbbcd69441d205715" - integrity sha512-JEhMNwUJt7bw728CydvYzntD0XJeTmDnvwLlbfbAhE7Tbslm/ax6bdIiUwTgeVlZTsJQPwZwKpAkyDtIjsvx3g== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -6021,9 +5050,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/mysql@2.15.26": version "2.15.26" @@ -6062,9 +5091,9 @@ "@types/pg" "*" "@types/pg@*": - version "8.11.10" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.11.10.tgz#b8fb2b2b759d452fe3ec182beadd382563b63291" - integrity sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg== + version "8.11.11" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.11.11.tgz#3bdce0580e521a62a62339a53d110458d9eae6df" + integrity sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw== dependencies: "@types/node" "*" pg-protocol "*" @@ -6079,20 +5108,27 @@ pg-protocol "*" pg-types "^2.2.0" +"@types/prop-types@*": + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== + "@types/qs@*": - version "6.9.17" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" - integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": version "1.2.7" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.0.3.tgz#0804dfd279a165d5a0ad8b53a5b9e65f338050a4" - integrity sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA== +"@types/react-dom@*", "@types/react-dom@18.3.1": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" + integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== + dependencies: + "@types/react" "*" "@types/react-modal@3.16.3": version "3.16.3" @@ -6107,19 +5143,20 @@ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== "@types/react@*": - version "19.0.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" - integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== - dependencies: - csstype "^3.0.2" - -"@types/react@19.0.8": version "19.0.8" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== dependencies: csstype "^3.0.2" +"@types/react@18.3.12": + version "18.3.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" + integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" @@ -6212,14 +5249,7 @@ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== -"@types/ws@*": - version "8.5.13" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" - integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== - dependencies: - "@types/node" "*" - -"@types/ws@8.5.14": +"@types/ws@*", "@types/ws@8.5.14": version "8.5.14" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== @@ -6264,15 +5294,7 @@ "@typescript-eslint/visitor-keys" "8.22.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.19.0", "@typescript-eslint/scope-manager@^8.15.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz#28fa413a334f70e8b506a968531e0a7c9c3076dc" - integrity sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA== - dependencies: - "@typescript-eslint/types" "8.19.0" - "@typescript-eslint/visitor-keys" "8.19.0" - -"@typescript-eslint/scope-manager@8.22.0": +"@typescript-eslint/scope-manager@8.22.0", "@typescript-eslint/scope-manager@^8.15.0": version "8.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz#e85836ddeb8eae715f870628bcc32fe96aaf4d0e" integrity sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ== @@ -6290,30 +5312,11 @@ debug "^4.3.4" ts-api-utils "^2.0.0" -"@typescript-eslint/types@8.19.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.19.0.tgz#a190a25c5484a42b81eaad06989579fdeb478cbb" - integrity sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA== - "@typescript-eslint/types@8.22.0": version "8.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.22.0.tgz#d9dec7116479ad03aeb6c8ac9c5223c4c79cf360" integrity sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A== -"@typescript-eslint/typescript-estree@8.19.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz#6b4f48f98ffad6597379951b115710f4d68c9ccb" - integrity sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw== - dependencies: - "@typescript-eslint/types" "8.19.0" - "@typescript-eslint/visitor-keys" "8.19.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/typescript-estree@8.22.0": version "8.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz#c188c3e19529d5b3145577c0bd967e2683b114df" @@ -6328,7 +5331,7 @@ semver "^7.6.0" ts-api-utils "^2.0.0" -"@typescript-eslint/utils@8.22.0": +"@typescript-eslint/utils@8.22.0", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.15.0", "@typescript-eslint/utils@^8.18.1": version "8.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.22.0.tgz#c8cc4e52a9c711af8a741a82dc5d7242b7a8dd44" integrity sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg== @@ -6338,24 +5341,6 @@ "@typescript-eslint/types" "8.22.0" "@typescript-eslint/typescript-estree" "8.22.0" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.15.0", "@typescript-eslint/utils@^8.18.1": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.19.0.tgz#33824310e1fccc17f27fbd1030fd8bbd9a674684" - integrity sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.19.0" - "@typescript-eslint/types" "8.19.0" - "@typescript-eslint/typescript-estree" "8.19.0" - -"@typescript-eslint/visitor-keys@8.19.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz#dc313f735e64c4979c9073f51ffcefb6d9be5c77" - integrity sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w== - dependencies: - "@typescript-eslint/types" "8.19.0" - eslint-visitor-keys "^4.2.0" - "@typescript-eslint/visitor-keys@8.22.0": version "8.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz#02cc005014c372033eb9171e2275b76cba722a3f" @@ -6365,9 +5350,9 @@ eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" - integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" @@ -6648,7 +5633,7 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-hidden@^1.1.1: +aria-hidden@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== @@ -6780,6 +5765,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-lock@^1.3.1: version "1.4.1" resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" @@ -6934,9 +5924,9 @@ balanced-match@^2.0.0: integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== bare-events@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc" - integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A== + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" @@ -7060,10 +6050,10 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.24.0, browserslist@^4.24.2: - version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" - integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== +browserslist@^4.24.0, browserslist@^4.24.3: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -7164,9 +6154,9 @@ camelize@^1.0.0: integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + version "1.0.30001696" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" + integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== ccount@^2.0.0: version "2.0.1" @@ -7377,10 +6367,10 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" - integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== +commander@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.0.0.tgz#1b161f60ee3ceb8074583a0f95359a4f8701845c" + integrity sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ== commander@^12.1.0: version "12.1.0" @@ -7418,9 +6408,9 @@ component-emitter@^1.3.0: integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compute-scroll-into-view@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" - integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa" + integrity sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw== concat-map@0.0.1: version "0.0.1" @@ -7472,16 +6462,16 @@ cookiejar@^2.1.4: integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== core-js-compat@^3.38.0, core-js-compat@^3.38.1: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" - integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.40.0.tgz#7485912a5a4a4315c2fdb2cbdc623e6881c88b38" + integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== dependencies: - browserslist "^4.24.2" + browserslist "^4.24.3" core-js@^3.0.0, core-js@^3.38.1: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83" - integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g== + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" + integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== core-util-is@~1.0.0: version "1.0.3" @@ -7675,11 +6665,12 @@ cssstyle@^2.3.0: cssom "~0.3.6" cssstyle@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" - integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.2.1.tgz#5142782410fea95db66fb68147714a652a7c2381" + integrity sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw== dependencies: - rrweb-cssom "^0.7.1" + "@asamuzakjp/css-color" "^2.8.2" + rrweb-cssom "^0.8.0" csstype@3.1.3, csstype@^3.0.2: version "3.1.3" @@ -7757,9 +6748,9 @@ debug@^3.1.0, debug@^3.2.7: ms "^2.1.1" decimal.js@10, decimal.js@^10.4.2, decimal.js@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== decode-named-character-reference@^1.0.0: version "1.0.2" @@ -7951,9 +6942,9 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" domutils@^3.0.1, domutils@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.1.tgz#b39f4c390a1ae6f6a2c56a5f5a16d6438b6bce28" - integrity sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" @@ -8005,9 +6996,9 @@ ejs@^3.1.10, ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.73: - version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" - integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + version "1.5.88" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz#cdb6e2dda85e6521e8d7d3035ba391c8848e073a" + integrity sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw== emittery@^0.13.1: version "0.13.1" @@ -8092,10 +7083,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6: - version "1.23.8" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.8.tgz#99754723118355d82fcef9ce4c90ccbcd5d2a285" - integrity sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ== +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== dependencies: array-buffer-byte-length "^1.0.2" arraybuffer.prototype.slice "^1.0.4" @@ -8108,10 +7099,11 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" + es-set-tostringtag "^2.1.0" es-to-primitive "^1.3.0" function.prototype.name "^1.1.8" - get-intrinsic "^1.2.6" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" get-symbol-description "^1.1.0" globalthis "^1.0.4" gopd "^1.2.0" @@ -8132,11 +7124,12 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.7" - own-keys "^1.0.0" + own-keys "^1.0.1" regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.3" safe-push-apply "^1.0.0" safe-regex-test "^1.1.0" + set-proto "^1.0.0" string.prototype.trim "^1.2.10" string.prototype.trimend "^1.0.9" string.prototype.trimstart "^1.0.8" @@ -8185,13 +7178,13 @@ es-module-lexer@^1.2.1: integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== @@ -8408,7 +7401,7 @@ eslint-plugin-react-hooks@^5.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== -eslint-plugin-react@7.37.4: +eslint-plugin-react@7.37.4, eslint-plugin-react@^7.37.0: version "7.37.4" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== @@ -8432,30 +7425,6 @@ eslint-plugin-react@7.37.4: string.prototype.matchall "^4.0.12" string.prototype.repeat "^1.0.0" -eslint-plugin-react@^7.37.0: - version "7.37.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" - integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.8" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - eslint-plugin-testing-library@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.1.1.tgz#df834e821e53fa81c1eb1fad5a0d9ba4c510f9ea" @@ -8708,18 +7677,7 @@ fast-glob@3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.2, fast-glob@^3.3.3: +fast-glob@^3.2.9, fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -8746,9 +7704,9 @@ fast-safe-stringify@^2.1.1: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-uri@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" - integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fastest-levenshtein@^1.0.16: version "1.0.16" @@ -8770,9 +7728,9 @@ fb-watchman@^2.0.0: bser "2.1.1" fdir@^6.2.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== fetch-mock@9.11.0: version "9.11.0" @@ -8795,10 +7753,10 @@ fflate@^0.4.8: resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== -figlet@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" - integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== +figlet@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.8.0.tgz#1b93c4f65f4c1a3b1135221987eee8cf8b9c0ac7" + integrity sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw== file-entry-cache@^10.0.5: version "10.0.6" @@ -8901,11 +7859,11 @@ fontkit@^2.0.2: unicode-trie "^2.0.0" for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + version "0.3.4" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.4.tgz#814517ffc303d1399b2564d8165318e735d0341c" + integrity sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" form-data@^4.0.0: version "4.0.1" @@ -8941,9 +7899,9 @@ fresh@0.5.2: integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -9045,21 +8003,21 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" - integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" + integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== dependencies: call-bind-apply-helpers "^1.0.1" - dunder-proto "^1.0.0" es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" function-bind "^1.1.2" + get-proto "^1.0.0" gopd "^1.2.0" has-symbols "^1.1.0" hasown "^2.0.2" - math-intrinsics "^1.0.0" + math-intrinsics "^1.1.0" get-nonce@^1.0.0: version "1.0.1" @@ -9076,10 +8034,10 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.0.tgz#2f14be4ab6a5ba2ca65b49defb544280730d9c5c" - integrity sha512-TtLgOcKaF1nMP2ijJnITkE4nRhbpshHhmzKiuhmSniiwWzovoqwqQ8rNuhf0mXJOqIY5iU+QkUe0CkJYrLsG9w== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" @@ -9099,9 +8057,9 @@ get-symbol-description@^1.1.0: get-intrinsic "^1.2.6" get-tsconfig@^4.7.5: - version "4.8.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" - integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -9269,7 +8227,7 @@ has-symbols@^1.0.3, has-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -9724,20 +8682,13 @@ i18next-parser@9.1.0: vinyl "^3.0.0" vinyl-fs "^4.0.0" -i18next@24.2.2: +i18next@24.2.2, "i18next@^23.5.1 || ^24.2.0": version "24.2.2" resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.2.tgz#3ba3d213302068d569142737f03f30929de696de" integrity sha512-NE6i86lBCKRYZa5TaUDkU5S4HFgLIEJRLr3Whf2psgaxBleQ2LC1YW1Vc+SCgkAW7VEzndT6al6+CzegSUHcTQ== dependencies: "@babel/runtime" "^7.23.2" -"i18next@^23.5.1 || ^24.2.0": - version "24.2.0" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.0.tgz#344c15a6f3b43d02aed78e2b08532e5b170951b4" - integrity sha512-ArJJTS1lV6lgKH7yEf4EpgNZ7+THl7bsGxxougPYiXRTJ/Fe1j08/TBpV9QsXCIYVfdE/HWG/xLezJ5DOlfBOA== - dependencies: - "@babel/runtime" "^7.23.2" - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -9851,13 +8802,13 @@ internal-slot@^1.1.0: side-channel "^1.1.0" intl-messageformat@^10.1.0: - version "10.7.10" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.10.tgz#fc8fc8c13b0a4104ba08dc2f5f9225f14945bcb7" - integrity sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw== + version "10.7.14" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.14.tgz#ddcbbfdb1682afe56da094f21a4ac74fc3c91552" + integrity sha512-mMGnE4E1otdEutV5vLUdCxRJygHB5ozUBxsPB5qhitewssrS/qGruq9bmvIRkkGsNeK5ZWLfYRld18UHGTIifQ== dependencies: - "@formatjs/ecma402-abstract" "2.3.1" - "@formatjs/fast-memoize" "2.2.5" - "@formatjs/icu-messageformat-parser" "2.9.7" + "@formatjs/ecma402-abstract" "2.3.2" + "@formatjs/fast-memoize" "2.2.6" + "@formatjs/icu-messageformat-parser" "2.11.0" tslib "2" ipaddr.js@1.9.1: @@ -9885,11 +8836,15 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-tostringtag "^1.0.0" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-bigint@^1.1.0: version "1.1.0" @@ -9925,7 +8880,7 @@ is-bun-module@^1.0.2: dependencies: semver "^7.6.3" -is-callable@^1.1.3, is-callable@^1.2.7: +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -9977,11 +8932,14 @@ is-generator-fn@^2.0.0: integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" @@ -10860,7 +9818,7 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lib0@^0.2.42, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87, lib0@^0.2.98, lib0@^0.2.99: +lib0@^0.2.42, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87, lib0@^0.2.99: version "0.2.99" resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.99.tgz#80d715dbd75496dabe0a1f5061fbb4ea162d2532" integrity sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w== @@ -10955,7 +9913,7 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.0.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -10969,7 +9927,7 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.2.0: +lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -11056,7 +10014,7 @@ matcher-collection@^2.0.0: "@types/minimatch" "^3.0.3" minimatch "^3.0.2" -math-intrinsics@^1.0.0, math-intrinsics@^1.1.0: +math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== @@ -11759,9 +10717,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@^3.61.0: - version "3.71.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" - integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw== + version "3.73.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.73.0.tgz#4459ea77e71969edba8588387eecb05e2c2cff3b" + integrity sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg== dependencies: semver "^7.3.5" @@ -11932,10 +10890,10 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -oniguruma-to-es@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz#a696b95e6c523f5521d8ee7af5f4a54f1582febd" - integrity sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg== +oniguruma-to-es@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz#35ea9104649b7c05f3963c6b3b474d964625028b" + integrity sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g== dependencies: emoji-regex-xs "^1.0.0" regex "^5.1.1" @@ -11958,7 +10916,7 @@ orderedmap@^2.0.0: resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== -own-keys@^1.0.0: +own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== @@ -12159,7 +11117,7 @@ pg-types@^4.0.1: postgres-interval "^3.0.0" postgres-range "^1.1.1" -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -12554,9 +11512,9 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor prosemirror-model "^1.21.0" prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.33.7, prosemirror-view@^1.37.0, prosemirror-view@^1.37.1: - version "1.37.1" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.37.1.tgz#3ccd67cd3d831eb37a2505dd34151932462172fb" - integrity sha512-MEAnjOdXU1InxEmhjgmEzQAikaS6lF3hD64MveTPpjOGNTl87iRLA1HupC/DEV6YuK7m4Q9DHFNTjwIVtqz5NA== + version "1.37.2" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.37.2.tgz#e16b92611c6d0f30695606724dc4a9575ce7ca6b" + integrity sha512-ApcyrfV/cRcaL65on7TQcfWElwLyOgIjnIynfAuV+fIdlpbSvSWRwfuPaH7T5mo4AbO/FID29qOtjiDIKGWyog== dependencies: prosemirror-model "^1.20.0" prosemirror-state "^1.0.0" @@ -12610,11 +11568,11 @@ qs@6.13.0: side-channel "^1.0.6" qs@^6.11.0: - version "6.13.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" - integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" querystring@^0.2.0: version "0.2.1" @@ -12636,11 +11594,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - queue@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" @@ -12757,7 +11710,7 @@ react-aria-components@1.6.0: react-stately "^3.35.0" use-sync-external-store "^1.2.0" -react-aria@3.36.0, react-aria@^3.36.0: +react-aria@3.36.0: version "3.36.0" resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.36.0.tgz#95a8e3340ab400bfec4d159e47da8861469e5bcd" integrity sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw== @@ -12802,7 +11755,7 @@ react-aria@3.36.0, react-aria@^3.36.0: "@react-aria/visually-hidden" "^3.8.18" "@react-types/shared" "^3.26.0" -react-aria@^3.37.0: +react-aria@^3.36.0, react-aria@^3.37.0: version "3.37.0" resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.37.0.tgz#c561d605b19fe89e4056f98990486d17a56c5352" integrity sha512-u3WUEMTcbQFaoHauHO3KhPaBYzEv1o42EdPcLAs05GBw9Q6Axlqwo73UFgMrsc2ElwLAZ4EKpSdWHLo1R5gfiw== @@ -12847,12 +11800,13 @@ react-aria@^3.37.0: "@react-aria/visually-hidden" "^3.8.19" "@react-types/shared" "^3.27.0" -react-dom@*, react-dom@19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" - integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== +react-dom@*, react-dom@18.3.1, react-dom@19.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: - scheduler "^0.25.0" + loose-envify "^1.1.0" + scheduler "^0.23.2" react-i18next@15.4.0: version "15.4.0" @@ -12907,7 +11861,7 @@ react-modal@3.16.3: react-lifecycles-compat "^3.0.0" warning "^4.0.3" -react-number-format@^5.4.2: +react-number-format@^5.4.3: version "5.4.3" resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-5.4.3.tgz#e634df907da7742faf597afab3f25f9a59689d60" integrity sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ== @@ -12920,16 +11874,16 @@ react-remove-scroll-bar@^2.3.7: react-style-singleton "^2.2.2" tslib "^2.0.0" -react-remove-scroll@^2.6.0, react-remove-scroll@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz#2518d2c5112e71ea8928f1082a58459b5c7a2a97" - integrity sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw== +react-remove-scroll@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz#df02cde56d5f2731e058531f8ffd7f9adec91ac2" + integrity sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ== dependencies: react-remove-scroll-bar "^2.3.7" - react-style-singleton "^2.2.1" + react-style-singleton "^2.2.3" tslib "^2.1.0" use-callback-ref "^1.3.3" - use-sidecar "^1.1.2" + use-sidecar "^1.1.3" react-select@5.10.0: version "5.10.0" @@ -12946,7 +11900,7 @@ react-select@5.10.0: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.2.0" -react-stately@3.34.0, react-stately@^3.34.0: +react-stately@3.34.0: version "3.34.0" resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.34.0.tgz#981713fa00bb2ef07b981dbce466d9a5774101d4" integrity sha512-0N9tZ8qQ/CxpJH7ao0O6gr+8955e7VrOskg9N+TIxkFknPetwOCtgppMYhnTfteBV8WfM/vv4OC1NbkgYTqXJA== @@ -12977,7 +11931,7 @@ react-stately@3.34.0, react-stately@^3.34.0: "@react-stately/tree" "^3.8.6" "@react-types/shared" "^3.26.0" -react-stately@^3.35.0: +react-stately@^3.34.0, react-stately@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.35.0.tgz#92bfc83bb4f7626a57c6aeabe4d08aeaab1fa2f7" integrity sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA== @@ -13008,7 +11962,7 @@ react-stately@^3.35.0: "@react-stately/tree" "^3.8.7" "@react-types/shared" "^3.27.0" -react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: +react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== @@ -13035,10 +11989,12 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, react@19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" - integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== +react@*, react@18.3.1, react@19.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" readable-stream@^3.4.0: version "3.6.2" @@ -13078,17 +12034,17 @@ redent@^3.0.0: strip-indent "^3.0.0" reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f" - integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q== + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" define-properties "^1.2.1" - dunder-proto "^1.0.1" - es-abstract "^1.23.6" + es-abstract "^1.23.9" es-errors "^1.3.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" which-builtin-type "^1.2.1" regenerate-unicode-properties@^10.2.0: @@ -13136,13 +12092,15 @@ regex@^5.1.1: regex-utilities "^2.3.0" regexp.prototype.flags@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" - integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" set-function-name "^2.0.2" regexpu-core@^6.2.0: @@ -13277,9 +12235,9 @@ require-from-string@^2.0.2: integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-in-the-middle@^7.1.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz#606977820d4b5f9be75e5a108ce34cfed25b3bb4" - integrity sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ== + version "7.5.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.5.0.tgz#6466fa87d6297b46d3ceca99ec03f901cab35d11" + integrity sha512-/Tvpny/RVVicqlYTKwt/GtpZRsPG1CmJNhxVKGz+Sy/4MONfXCVNK69MFgGKdUt0/324q3ClI2dICcPgISrC8g== dependencies: debug "^4.3.5" module-details-from-path "^1.0.3" @@ -13399,6 +12357,11 @@ rrweb-cssom@^0.7.1: resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== +rrweb-cssom@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" + integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== + rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -13483,10 +12446,12 @@ scheduler@0.25.0-rc-603e6108-20241029: resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz#684dd96647e104d23e0d29a37f18937daf82df19" integrity sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA== -scheduler@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" - integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" schema-utils@^3.2.0: version "3.3.0" @@ -13575,6 +12540,15 @@ set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -13632,17 +12606,17 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shiki@^1.22.0: - version "1.25.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.25.1.tgz#0f3907b0f9deebadfb6a1f248804d8791522d7e3" - integrity sha512-/1boRvNYwRW3GLG9Y6dXdnZ/Ha+J5T/5y3hV7TGQUcDSBM185D3FCbXlz2eTGNKG2iWCbWqo+P0yhGKZ4/CUrw== + version "1.29.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.29.1.tgz#7900a5450e20b6a01c046c3d15da342bee3dceb8" + integrity sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw== dependencies: - "@shikijs/core" "1.25.1" - "@shikijs/engine-javascript" "1.25.1" - "@shikijs/engine-oniguruma" "1.25.1" - "@shikijs/langs" "1.25.1" - "@shikijs/themes" "1.25.1" - "@shikijs/types" "1.25.1" - "@shikijs/vscode-textmate" "^9.3.1" + "@shikijs/core" "1.29.1" + "@shikijs/engine-javascript" "1.29.1" + "@shikijs/engine-oniguruma" "1.29.1" + "@shikijs/langs" "1.29.1" + "@shikijs/themes" "1.29.1" + "@shikijs/types" "1.29.1" + "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" shimmer@^1.2.1: @@ -13853,12 +12827,11 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: - version "2.21.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" - integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: fast-fifo "^1.3.2" - queue-tick "^1.0.1" text-decoder "^1.1.0" optionalDependencies: bare-events "^2.2.0" @@ -14321,17 +13294,17 @@ tippy.js@^6.3.7: dependencies: "@popperjs/core" "^2.9.0" -tldts-core@^6.1.70: - version "6.1.70" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" - integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== +tldts-core@^6.1.75: + version "6.1.75" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.75.tgz#63c89f72d4dd7376501ba7d608e1cc2b2d1210e2" + integrity sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw== tldts@^6.1.32: - version "6.1.70" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" - integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== + version "6.1.75" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.75.tgz#de8b1b7c35217c0c356bb7199e70b5a802532933" + integrity sha512-+lFzEXhpl7JXgWYaXcB6DqTYXbUArvrWAE/5ioq/X3CdWLbDjpPP4XTrQBmEJ91y3xbe4Fkw7Lxv4P3GWeJaNg== dependencies: - tldts-core "^6.1.70" + tldts-core "^6.1.75" tmpl@1.0.5: version "1.0.5" @@ -14373,9 +13346,9 @@ tough-cookie@^4.1.2: url-parse "^1.5.3" tough-cookie@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" - integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + version "5.1.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.0.tgz#0667b0f2fbb5901fe6f226c3e0b710a9a4292f87" + integrity sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg== dependencies: tldts "^6.1.32" @@ -14420,11 +13393,6 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== -ts-api-utils@^1.3.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" - integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== - ts-api-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" @@ -14529,9 +13497,9 @@ type-fest@^0.7.1: integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== type-fest@^4.27.0: - version "4.31.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.31.0.tgz#a3de630c96eb77c281b6ba2affa5dae5fb3c326c" - integrity sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ== + version "4.33.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.33.0.tgz#2da0c135b9afa76cf8b18ecfd4f260ecd414a432" + integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== type-is@~1.6.18: version "1.6.18" @@ -14625,9 +13593,9 @@ undici-types@~6.20.0: integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^6.19.5: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" - integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + version "6.21.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" + integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -14813,12 +13781,12 @@ upath@^1.2.0: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -14864,7 +13832,7 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -use-sidecar@^1.1.2: +use-sidecar@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== @@ -14888,9 +13856,9 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.3.tgz#248451cac9d1a4a4128033e765d137e2b2c49a3d" - integrity sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg== + version "11.0.5" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" + integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== uuid@^8.3.2: version "8.3.2" @@ -15591,20 +14559,13 @@ yargs@17.7.2, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yjs@13.6.23: +yjs@13.6.23, yjs@^13.6.15: version "13.6.23" resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.23.tgz#62358dfa52e92dc870b8a0bedcf0d4cbd4c5ffa8" integrity sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few== dependencies: lib0 "^0.2.99" -yjs@^13.6.15: - version "13.6.21" - resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.21.tgz#888b7077a7236120ae6b74e58ddbef3c9863825a" - integrity sha512-/fzzyeCAfr3Qwx1D71zvumm64x+Q5MEFel6EhWlA1IBFxWPb7tei4J2a8CJyjpYHfVrRij5q3RJTK9W2Iqjouw== - dependencies: - lib0 "^0.2.98" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 929a50b573c1787ffc53bed75e5d1c9631ef008e Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 29 Jan 2025 15:36:09 +0100 Subject: [PATCH 22/22] =?UTF-8?q?=E2=AC=87=EF=B8=8F(frontend)=20downgrade?= =?UTF-8?q?=20cunningham=20to=202.9.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The last version of Cunningham has problems. Better to downgrade to the previous version. We add cunningham library to renovate.json to prevent future upgrade with Renovate. An issue will be open to upgrade to the last version manually. --- renovate.json | 1 + src/frontend/apps/impress/package.json | 2 +- src/frontend/yarn.lock | 685 +++++++++++++------------ 3 files changed, 354 insertions(+), 334 deletions(-) diff --git a/renovate.json b/renovate.json index aea7be91..78358eff 100644 --- a/renovate.json +++ b/renovate.json @@ -14,6 +14,7 @@ "groupName": "ignored js dependencies", "matchManagers": ["npm"], "matchPackageNames": [ + "@openfun/cunningham-react", "@types/react", "@types/react-dom", "eslint", diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index 91525f2c..2beb5608 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -22,7 +22,7 @@ "@blocknote/xl-pdf-exporter": "0.21.0", "@gouvfr-lasuite/integration": "1.0.2", "@hocuspocus/provider": "2.15.1", - "@openfun/cunningham-react": "3.0.0", + "@openfun/cunningham-react": "2.9.4", "@react-pdf/renderer": "4.1.6", "@sentry/nextjs": "8.52.0", "@tanstack/react-query": "5.65.1", diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index ae4c8e1f..757f2160 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -1467,15 +1467,15 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== -"@fontsource-variable/roboto-flex@5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@fontsource-variable/roboto-flex/-/roboto-flex-5.1.1.tgz#6cb42a852ff44bd1574491c33d79aa3c872fff3e" - integrity sha512-cMtqtR+EhqTcox5+Sz+/+N7C8hHheQm1EtxJ9qrr356N2lwbpEU0y5OA4as+V7cdiaEFxXw6jzO9KoqLMZ6tNg== +"@fontsource-variable/roboto-flex@5.0.16": + version "5.0.16" + resolved "https://registry.yarnpkg.com/@fontsource-variable/roboto-flex/-/roboto-flex-5.0.16.tgz#277bcd53e7548d21db2b091eb58fd9c4c9792853" + integrity sha512-aMJw0ac9M2fu78YUx5BRtdSqNqGV4cJPF6lbFpow8e0hXVH7wPwk5d0mpox1MTwvHFHRStmkYVB/SSUytmlaSw== -"@fontsource/material-icons-outlined@5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@fontsource/material-icons-outlined/-/material-icons-outlined-5.1.1.tgz#3a659277f5029fb1ea5f64739d7ef48fd2112a8e" - integrity sha512-HjWe3anHu9RptoAvm2UF6MPXkwsbFbH+vkg48GRIhXPsXyfmZteGHVFZpPxaZnakrmnLXDxUnnKSj7zzqk+Rhg== +"@fontsource/material-icons-outlined@5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@fontsource/material-icons-outlined/-/material-icons-outlined-5.0.13.tgz#f8f2a669cb5bdc45fb3ca41f057bc149e3484695" + integrity sha512-mQxKJcFiwclTJd0G5fUg0gJ/ZszdaZRSIMFkvbPvMUteA9aSFzFswHr9Yuacw+x4wlBl7GlsVCujAPaBeLv/dw== "@formatjs/ecma402-abstract@2.3.2": version "2.3.2" @@ -1691,21 +1691,21 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== -"@internationalized/date@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.6.0.tgz#b30d43030bfed1855f20c9503606926d75bfdf64" - integrity sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ== +"@internationalized/date@3.5.5": + version "3.5.5" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.5.tgz#7d34cb9da35127f98dd669fc926bb37e771e177f" + integrity sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/date@^3.6.0", "@internationalized/date@^3.7.0": +"@internationalized/date@^3.5.5", "@internationalized/date@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.7.0.tgz#23a4956308ee108e308517a7137c69ab8f5f2ad9" integrity sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/message@^3.1.6": +"@internationalized/message@^3.1.4", "@internationalized/message@^3.1.6": version "3.1.6" resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.6.tgz#e5a832788a17214bfb3e5bbf5f0e23ed2f568ad7" integrity sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ== @@ -1713,14 +1713,14 @@ "@swc/helpers" "^0.5.0" intl-messageformat "^10.1.0" -"@internationalized/number@^3.6.0": +"@internationalized/number@^3.5.3", "@internationalized/number@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.6.0.tgz#dc6ba20c41b25eb605f1d5cac7d8668e9022c224" integrity sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/string@^3.2.5": +"@internationalized/string@^3.2.3", "@internationalized/string@^3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.5.tgz#2f387b256e79596a2e62ddd5e15c619fe241189c" integrity sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw== @@ -2095,31 +2095,31 @@ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@openfun/cunningham-react@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@openfun/cunningham-react/-/cunningham-react-3.0.0.tgz#0978fa63ca1b56b04bd6525a9f46534731a7c187" - integrity sha512-9LhcqiAkCriJbQouc3wiIJ1Ujd8Q9uvo0mubw21yZTm5d6TLj/XNzzX0mwWaoVSe2szHtcR0vjpRqls2Ue7u4g== +"@openfun/cunningham-react@2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@openfun/cunningham-react/-/cunningham-react-2.9.4.tgz#f8dba15033597d8d5cbd96601c3a624e1e273df9" + integrity sha512-jz91L48LoSwL1cH3pfuMRdlGdVEeAkRhR6iseRtNQTcoUi5DIDsZemdtf0ltoxJOYjitZdcOC1U6/J8TV3H+Xg== dependencies: - "@fontsource-variable/roboto-flex" "5.1.1" - "@fontsource/material-icons-outlined" "5.1.1" - "@internationalized/date" "3.6.0" + "@fontsource-variable/roboto-flex" "5.0.16" + "@fontsource/material-icons-outlined" "5.0.13" + "@internationalized/date" "3.5.5" "@openfun/cunningham-tokens" "*" - "@react-aria/calendar" "3.6.0" - "@react-aria/datepicker" "3.12.0" - "@react-aria/i18n" "3.12.4" - "@react-stately/calendar" "3.6.0" - "@react-stately/datepicker" "3.11.0" - "@tanstack/react-table" "8.20.6" + "@react-aria/calendar" "3.5.11" + "@react-aria/datepicker" "3.11.2" + "@react-aria/i18n" "3.12.2" + "@react-stately/calendar" "3.5.4" + "@react-stately/datepicker" "3.10.2" + "@tanstack/react-table" "8.20.1" "@types/react-modal" "3.16.3" - chromatic "11.22.0" + chromatic "11.7.1" classnames "2.5.1" downshift "9.0.8" - react "19.0.0" - react-aria "3.36.0" - react-aria-components "1.5.0" - react-dom "19.0.0" - react-modal "3.16.3" - react-stately "3.34.0" + react "18.3.1" + react-aria "3.34.2" + react-aria-components "1.3.2" + react-dom "18.3.1" + react-modal "3.16.1" + react-stately "3.32.2" "@openfun/cunningham-tokens@*": version "2.2.0" @@ -2607,7 +2607,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/breadcrumbs@^3.5.19", "@react-aria/breadcrumbs@^3.5.20": +"@react-aria/breadcrumbs@^3.5.16", "@react-aria/breadcrumbs@^3.5.20": version "3.5.20" resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.20.tgz#b4b2d8647b6386d34c721db4a22f1675c63c1a97" integrity sha512-xqVSSDPpQuUFpJyIXMQv8L7zumk5CeGX7qTzo4XRvqm5T9qnNAX4XpYEMdktnLrQRY/OemCBScbx7SEwr0B3Kg== @@ -2619,7 +2619,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/button@^3.11.0", "@react-aria/button@^3.11.1": +"@react-aria/button@^3.11.1", "@react-aria/button@^3.9.8": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.11.1.tgz#f285ab52ecb613d2233e3a54c6f3d4f394b6062d" integrity sha512-NSs2HxHSSPSuYy5bN+PMJzsCNDVsbm1fZ/nrWM2WWWHTBrx9OqyrEXZVV9ebzQCN9q0nzhwpf6D42zHIivWtJA== @@ -2633,23 +2633,23 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.6.0.tgz#d5e7cf4beb8724648a7042dbc5bb519de4351906" - integrity sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg== +"@react-aria/calendar@3.5.11": + version "3.5.11" + resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.5.11.tgz#da75da0eaf40a48d33a766b67fc342dc21deb21d" + integrity sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q== dependencies: - "@internationalized/date" "^3.6.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/utils" "^3.26.0" - "@react-stately/calendar" "^3.6.0" - "@react-types/button" "^3.10.1" - "@react-types/calendar" "^3.5.0" - "@react-types/shared" "^3.26.0" + "@internationalized/date" "^3.5.5" + "@react-aria/i18n" "^3.12.2" + "@react-aria/interactions" "^3.22.2" + "@react-aria/live-announcer" "^3.3.4" + "@react-aria/utils" "^3.25.2" + "@react-stately/calendar" "^3.5.4" + "@react-types/button" "^3.9.6" + "@react-types/calendar" "^3.4.9" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@^3.6.0", "@react-aria/calendar@^3.7.0": +"@react-aria/calendar@^3.5.11", "@react-aria/calendar@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.7.0.tgz#b0a13dc0acc762157cc774e96dd5dfe8cd624c10" integrity sha512-9YUbgcox7cQgvZfQtL2BLLRsIuX4mJeclk9HkFoOsAu3RGO5HNsteah8FV54W8BMjm/bNRXIPUxtjTTP+1L6jg== @@ -2665,7 +2665,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/checkbox@^3.15.0", "@react-aria/checkbox@^3.15.1": +"@react-aria/checkbox@^3.14.6", "@react-aria/checkbox@^3.15.1": version "3.15.1" resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.15.1.tgz#384806adc3c2700cb09b2c4e03d8ad25c8ec3892" integrity sha512-ETgsMDZ0IZzRXy/OVlGkazm8T+PcMHoTvsxp0c+U82c8iqdITA+VJ615eBPOQh6OkkYIIn4cRn/e+69RmGzXng== @@ -2682,14 +2682,14 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/collections@3.0.0-alpha.6": - version "3.0.0-alpha.6" - resolved "https://registry.yarnpkg.com/@react-aria/collections/-/collections-3.0.0-alpha.6.tgz#2fab7192ba4ac1452ad01b2c5456195a16f353e1" - integrity sha512-A+7Eap/zvsghMb5/C3EAPn41axSzRhtX2glQRXSBj1mK31CTPCZ9BhrMIMC5DL7ZnfA7C+Ysilo9nI2YQh5PMg== +"@react-aria/collections@3.0.0-alpha.4": + version "3.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@react-aria/collections/-/collections-3.0.0-alpha.4.tgz#ad1e8eea9d3c784d17a4de43b3e52d888f45efdd" + integrity sha512-chMNAlsubnpErBWN7sLhmAMOnE7o17hSfq3s0VDHlvRN9K/mPOPlYokmyWkkPqi7fYiR50EPVHDtwTWLJoqfnw== dependencies: - "@react-aria/ssr" "^3.9.7" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" + "@react-aria/ssr" "^3.9.5" + "@react-aria/utils" "^3.25.2" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" use-sync-external-store "^1.2.0" @@ -2704,7 +2704,26 @@ "@swc/helpers" "^0.5.0" use-sync-external-store "^1.2.0" -"@react-aria/color@^3.0.2", "@react-aria/color@^3.0.3": +"@react-aria/color@3.0.0-rc.2": + version "3.0.0-rc.2" + resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.0-rc.2.tgz#b16f363fd61ff11875f3ec49d1f8ad7804919c65" + integrity sha512-h4P7LocDEHPOEWgHYb8VPJLRGkyMhcsXemmvGao6G23zGTpTX8Nr6pEuJhcXQlGWt8hXvj/ASnC750my+zb1yA== + dependencies: + "@react-aria/i18n" "^3.12.2" + "@react-aria/interactions" "^3.22.2" + "@react-aria/numberfield" "^3.11.6" + "@react-aria/slider" "^3.7.11" + "@react-aria/spinbutton" "^3.6.8" + "@react-aria/textfield" "^3.14.8" + "@react-aria/utils" "^3.25.2" + "@react-aria/visually-hidden" "^3.8.15" + "@react-stately/color" "^3.7.2" + "@react-stately/form" "^3.0.5" + "@react-types/color" "3.0.0-rc.1" + "@react-types/shared" "^3.24.1" + "@swc/helpers" "^0.5.0" + +"@react-aria/color@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@react-aria/color/-/color-3.0.3.tgz#28048b8f0d7986bd2f9678e72a135bef15f48a93" integrity sha512-DDVma2107VHBfSuEnnmy+KJvXvxEXWSAooii2vlHHmQNb5x4rv4YTk+dP5GZl/7MgT8OgPTB9UHoC83bXFMDRA== @@ -2723,7 +2742,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/combobox@^3.11.0", "@react-aria/combobox@^3.11.1": +"@react-aria/combobox@^3.10.2", "@react-aria/combobox@^3.11.1": version "3.11.1" resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.1.tgz#1bb3e390dc4fbe94c5f5c7b1f600f656abd2a8a1" integrity sha512-TTNbGhUuqxzPcJzd6hufOxuHzX0UARkw+0bl+TuCwNPQnqrcPf20EoOZvd3MHZwGq6GCP4QV+qo0uGx83RpUvA== @@ -2744,31 +2763,31 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.12.0.tgz#a82ff3ebd3ead20a00096d082c1e6be47bbd5886" - integrity sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg== +"@react-aria/datepicker@3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.11.2.tgz#628f70ea532480421e7ebe1f0020856baee60639" + integrity sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA== dependencies: - "@internationalized/date" "^3.6.0" - "@internationalized/number" "^3.6.0" - "@internationalized/string" "^3.2.5" - "@react-aria/focus" "^3.19.0" - "@react-aria/form" "^3.0.11" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/spinbutton" "^3.6.10" - "@react-aria/utils" "^3.26.0" - "@react-stately/datepicker" "^3.11.0" - "@react-stately/form" "^3.1.0" - "@react-types/button" "^3.10.1" - "@react-types/calendar" "^3.5.0" - "@react-types/datepicker" "^3.9.0" - "@react-types/dialog" "^3.5.14" - "@react-types/shared" "^3.26.0" + "@internationalized/date" "^3.5.5" + "@internationalized/number" "^3.5.3" + "@internationalized/string" "^3.2.3" + "@react-aria/focus" "^3.18.2" + "@react-aria/form" "^3.0.8" + "@react-aria/i18n" "^3.12.2" + "@react-aria/interactions" "^3.22.2" + "@react-aria/label" "^3.7.11" + "@react-aria/spinbutton" "^3.6.8" + "@react-aria/utils" "^3.25.2" + "@react-stately/datepicker" "^3.10.2" + "@react-stately/form" "^3.0.5" + "@react-types/button" "^3.9.6" + "@react-types/calendar" "^3.4.9" + "@react-types/datepicker" "^3.8.2" + "@react-types/dialog" "^3.5.12" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@^3.12.0", "@react-aria/datepicker@^3.13.0": +"@react-aria/datepicker@^3.11.2", "@react-aria/datepicker@^3.13.0": version "3.13.0" resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.13.0.tgz#ea1f5085da5b8b50c932e94716a7f8bdd0f489f0" integrity sha512-TmJan65P3Vk7VDBNW5rH9Z25cAn0vk8TEtaP3boCs8wJFE+HbEuB8EqLxBFu47khtuKTEqDP3dTlUh2Vt/f7Xw== @@ -2792,7 +2811,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/dialog@^3.5.20", "@react-aria/dialog@^3.5.21": +"@react-aria/dialog@^3.5.17", "@react-aria/dialog@^3.5.21": version "3.5.21" resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.21.tgz#ded634dda5c16b720595f4a1aaa0cfb09b4979ff" integrity sha512-tBsn9swBhcptJ9QIm0+ur0PVR799N6qmGguva3rUdd+gfitknFScyT08d7AoMr9AbXYdJ+2R9XNSZ3H3uIWQMw== @@ -2804,7 +2823,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/disclosure@^3.0.0", "@react-aria/disclosure@^3.0.1": +"@react-aria/disclosure@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@react-aria/disclosure/-/disclosure-3.0.1.tgz#a4ddecc8fe031c73c760d9de6fa241b88cf47171" integrity sha512-rNH8RFcePoAQizcqB7KuHbBOr7sPsysFKCUwbVSOXLPgvCfXKafIhjgFJVqekfsbn5zWvkcTupnzGVJj/F9p+g== @@ -2815,7 +2834,7 @@ "@react-types/button" "^3.10.2" "@swc/helpers" "^0.5.0" -"@react-aria/dnd@^3.8.0", "@react-aria/dnd@^3.8.1": +"@react-aria/dnd@^3.7.2", "@react-aria/dnd@^3.8.1": version "3.8.1" resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.8.1.tgz#acb1aae522c6e28b9eb0ae1ff5f009e28962fba4" integrity sha512-FoXYQ4z33E9YBzIGRJM1B1oZep6CvEWgXvjCZGURatjr3qG7vf95mOqA5kVd9bjLL7QK4w0ujJWEBfog3WmufA== @@ -2831,7 +2850,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/focus@^3.19.0", "@react-aria/focus@^3.19.1": +"@react-aria/focus@^3.18.2", "@react-aria/focus@^3.19.1": version "3.19.1" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.1.tgz#6655e53d04eb7b46c8d39e671013d1c17fca5ba2" integrity sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg== @@ -2842,7 +2861,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@^3.0.11", "@react-aria/form@^3.0.12": +"@react-aria/form@^3.0.12", "@react-aria/form@^3.0.8": version "3.0.12" resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.12.tgz#1d916c15dfa050e4c02a689151a92b4d10bec445" integrity sha512-8uvPYEd3GDyGt5NRJIzdWW1Ry5HLZq37vzRZKUW8alZ2upFMH3KJJG55L9GP59KiF6zBrYBebvI/YK1Ye1PE1g== @@ -2872,7 +2891,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/gridlist@^3.10.0", "@react-aria/gridlist@^3.10.1": +"@react-aria/gridlist@^3.10.1", "@react-aria/gridlist@^3.9.2": version "3.10.1" resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.10.1.tgz#75d2316633b3636607e448602bf518f7f9a9b59d" integrity sha512-11FlupBg5C9ehs7R6OjqMPWEOLK/4IuSrq7D1xU+Hnm7ZYI/KKcCXvNMjMmnOz/gGzOmfgVwz5PIKaY9aZarEg== @@ -2889,21 +2908,21 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@3.12.4": - version "3.12.4" - resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.4.tgz#4520ce48a1b6ebe4aa470d72eba300e65de01814" - integrity sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w== +"@react-aria/i18n@3.12.2": + version "3.12.2" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.2.tgz#f1e63ddb5227bc1c8a17cd3475235851e428dd0b" + integrity sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A== dependencies: - "@internationalized/date" "^3.6.0" - "@internationalized/message" "^3.1.6" - "@internationalized/number" "^3.6.0" - "@internationalized/string" "^3.2.5" - "@react-aria/ssr" "^3.9.7" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" + "@internationalized/date" "^3.5.5" + "@internationalized/message" "^3.1.4" + "@internationalized/number" "^3.5.3" + "@internationalized/string" "^3.2.3" + "@react-aria/ssr" "^3.9.5" + "@react-aria/utils" "^3.25.2" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.12.4", "@react-aria/i18n@^3.12.5": +"@react-aria/i18n@^3.12.2", "@react-aria/i18n@^3.12.5": version "3.12.5" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.5.tgz#7dc2ab8bbf2374c1797e3c553f34735be88f52eb" integrity sha512-ooeop2pTG94PuaHoN2OTk2hpkqVuoqgEYxRvnc1t7DVAtsskfhS/gVOTqyWGsxvwAvRi7m/CnDu6FYdeQ/bK5w== @@ -2917,7 +2936,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@^3.22.5", "@react-aria/interactions@^3.23.0": +"@react-aria/interactions@^3.22.2", "@react-aria/interactions@^3.23.0": version "3.23.0" resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.23.0.tgz#28fce22310faeaa114978728045fb2b4fe80acc8" integrity sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg== @@ -2927,7 +2946,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/label@^3.7.13", "@react-aria/label@^3.7.14": +"@react-aria/label@^3.7.11", "@react-aria/label@^3.7.14": version "3.7.14" resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.14.tgz#a4922cbfbbe20e8e14b84b0c56c504d73257f094" integrity sha512-EN1Md2YvcC4sMqBoggsGYUEGlTNqUfJZWzduSt29fbQp1rKU2KlybTe+TWxKq/r2fFd+4JsRXxMeJiwB3w2AQA== @@ -2936,7 +2955,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/link@^3.7.7", "@react-aria/link@^3.7.8": +"@react-aria/link@^3.7.4", "@react-aria/link@^3.7.8": version "3.7.8" resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.8.tgz#26813464e1adf443ede93ce44d7e2d4a3510d25c" integrity sha512-oiXUPQLZmf9Q9Xehb/sG1QRxfo28NFKdh9w+unD12sHI6NdLMETl5MA4CYyTgI0dfMtTjtfrF68GCnWfc7JvXQ== @@ -2948,7 +2967,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@^3.13.6", "@react-aria/listbox@^3.14.0": +"@react-aria/listbox@^3.13.2", "@react-aria/listbox@^3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.14.0.tgz#5de653504b3600fc3eabc7fa92927ddb5731fee1" integrity sha512-pyVbKavh8N8iyiwOx6I3JIcICvAzFXkKSFni1yarfgngJsJV3KSyOkzLomOfN9UhbjcV4sX61/fccwJuvlurlA== @@ -2963,14 +2982,14 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/live-announcer@^3.4.1": +"@react-aria/live-announcer@^3.3.4", "@react-aria/live-announcer@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.4.1.tgz#efedf706b23f6e1b526a3a35c14c202ac3e68487" integrity sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@^3.16.0", "@react-aria/menu@^3.17.0": +"@react-aria/menu@^3.15.2", "@react-aria/menu@^3.17.0": version "3.17.0" resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.17.0.tgz#e4a645366c82420520852dd42649a563ee732939" integrity sha512-aiFvSv3G1YvPC0klJQ/9quB05xIDZzJ5Lt6/CykP0UwGK5i8GCqm6/cyFLwEXsS5ooUPxS3bqmdOsgdADSSgqg== @@ -2990,7 +3009,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/meter@^3.4.18", "@react-aria/meter@^3.4.19": +"@react-aria/meter@^3.4.16", "@react-aria/meter@^3.4.19": version "3.4.19" resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.19.tgz#9cdb43c19749ec89d452b31e400dbac64cb2390d" integrity sha512-IIA+gTHrNVbMuBgcqdGLEKd/ZiKM2hOUqS6uztbT15dwPJTmtfJiTWA2872PiY52p+gqPSanZuTc2TXYJa+rew== @@ -3000,7 +3019,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/numberfield@^3.11.10", "@react-aria/numberfield@^3.11.9": +"@react-aria/numberfield@^3.11.10", "@react-aria/numberfield@^3.11.6": version "3.11.10" resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.11.10.tgz#ce6b0325c296799ff976a396e733c2ef7c89f784" integrity sha512-bYbTfO9NbAKMFOfEGGs+lvlxk0I9L0lU3WD2PFQZWdaoBz9TCkL+vK0fJk1zsuKaVjeGsmHP9VesBPRmaP0MiA== @@ -3017,7 +3036,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/overlays@^3.24.0", "@react-aria/overlays@^3.25.0": +"@react-aria/overlays@^3.23.2", "@react-aria/overlays@^3.25.0": version "3.25.0" resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.25.0.tgz#794c4f2f08ea6ccdd18b3030776b3929a4950cdb" integrity sha512-UEqJJ4duowrD1JvwXpPZreBuK79pbyNjNxFUVpFSskpGEJe3oCWwsSDKz7P1O7xbx5OYp+rDiY8fk/sE5rkaKw== @@ -3034,7 +3053,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/progress@^3.4.18", "@react-aria/progress@^3.4.19": +"@react-aria/progress@^3.4.16", "@react-aria/progress@^3.4.19": version "3.4.19" resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.19.tgz#722ea3389da0d067b092b13fe01c3edb2a9c4ce7" integrity sha512-5HHnBJHqEUuY+dYsjIZDYsENeKr49VCuxeaDZ0OSahbOlloIOB1baCo/6jLBv1O1rwrAzZ2gCCPcVGed/cjrcw== @@ -3046,7 +3065,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/radio@^3.10.10", "@react-aria/radio@^3.10.11": +"@react-aria/radio@^3.10.11", "@react-aria/radio@^3.10.7": version "3.10.11" resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.11.tgz#535ca489615e357292835026acb856d561651361" integrity sha512-R150HsBFPr1jLMShI4aBM8heCa1k6h0KEvnFRfTAOBu+B9hMSZOPB+d6GQOwGPysNlbset90Kej8G15FGHjqiA== @@ -3062,7 +3081,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/searchfield@^3.7.11", "@react-aria/searchfield@^3.8.0": +"@react-aria/searchfield@^3.7.8", "@react-aria/searchfield@^3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.8.0.tgz#72b836ed438cb0edff917881a033fd92f945919b" integrity sha512-AaZuH9YIWlMyE1m7cSjHCfOuQmlWN+w8HVW32TxeGGGL1kJsYAlSYWYHUyYFIKh245kq/m5zUxAxmw5Ygmnx5w== @@ -3076,7 +3095,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/select@^3.15.0", "@react-aria/select@^3.15.1": +"@react-aria/select@^3.14.8", "@react-aria/select@^3.15.1": version "3.15.1" resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.15.1.tgz#2497a78ad3ea87dc7e46f50e629594e69a5e840d" integrity sha512-FOtY1tuHt0YTHwOEy/sf7LEIL+Nnkho3wJmfpWQuTxsvMCF7UJdQPYPd6/jGCcCdiqW7H4iqyjUkSp6nk/XRWQ== @@ -3096,7 +3115,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/selection@^3.21.0", "@react-aria/selection@^3.22.0": +"@react-aria/selection@^3.19.2", "@react-aria/selection@^3.22.0": version "3.22.0" resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.22.0.tgz#29dd953cde1e1a3ba44e1d30d097d2babed03e7f" integrity sha512-XFOrK525HX2eeWeLZcZscUAs5qsuC1ZxsInDXMjvLeAaUPtQNEhUKHj3psDAl6XDU4VV1IJo0qCmFTVqTTMZSg== @@ -3109,7 +3128,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/separator@^3.4.4", "@react-aria/separator@^3.4.5": +"@react-aria/separator@^3.4.2", "@react-aria/separator@^3.4.5": version "3.4.5" resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.4.5.tgz#e9303d2ea41e4f09e925df047bb082731c1bf518" integrity sha512-RQA9sKZdAEjP1Yrv0GpDdXgmXd56kXDE8atPDHEC0/A4lpYh/YFLfXcv1JW0Hlg4kBocdX2pB2INyDGhiD+yfw== @@ -3118,7 +3137,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/slider@^3.7.14", "@react-aria/slider@^3.7.15": +"@react-aria/slider@^3.7.11", "@react-aria/slider@^3.7.15": version "3.7.15" resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.15.tgz#5cbce3b8f4ac55ff7794124f7bb3cd2edab6ae01" integrity sha512-v9tujsuvJYRX0vE/vMYBzTT9FXbzrLsjkOrouNq+UdBIr7wRjIWTHHM0j+khb2swyCWNTbdv6Ce316Zqx2qWFg== @@ -3133,7 +3152,7 @@ "@react-types/slider" "^3.7.8" "@swc/helpers" "^0.5.0" -"@react-aria/spinbutton@^3.6.10", "@react-aria/spinbutton@^3.6.11": +"@react-aria/spinbutton@^3.6.11", "@react-aria/spinbutton@^3.6.8": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.11.tgz#e6b7b740b95568851c36d4840a348b4756b33641" integrity sha512-RM+gYS9tf9Wb+GegV18n4ArK3NBKgcsak7Nx1CkEgX9BjJ0yayWUHdfEjRRvxGXl+1z1n84cJVkZ6FUlWOWEZA== @@ -3145,14 +3164,14 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.9.7": +"@react-aria/ssr@^3.9.5", "@react-aria/ssr@^3.9.7": version "3.9.7" resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770" integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/switch@^3.6.10", "@react-aria/switch@^3.6.11": +"@react-aria/switch@^3.6.11", "@react-aria/switch@^3.6.7": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.11.tgz#cd2e2e2de005b039c7822e796b3117703198c63d" integrity sha512-paYCpH+oeL+8rgQK+cBJ+IaZ1sXSh3+50WPlg2LvLBta0QVfQhPR4juPvfXRpfHHhCjFBgF4/RGbV8q5zpl3vA== @@ -3163,7 +3182,7 @@ "@react-types/switch" "^3.5.8" "@swc/helpers" "^0.5.0" -"@react-aria/table@^3.16.0", "@react-aria/table@^3.16.1": +"@react-aria/table@^3.15.2", "@react-aria/table@^3.16.1": version "3.16.1" resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.16.1.tgz#06dd8a9b390057c02c059e2dfd05482ca6e97c51" integrity sha512-T28TIGnKnPBunyErDBmm5jUX7AyzT7NVWBo9pDSt9wUuEnz0rVNd7p9sjmP2+u7I645feGG9klcdpCvFeqrk8A== @@ -3184,7 +3203,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-aria/tabs@^3.9.8", "@react-aria/tabs@^3.9.9": +"@react-aria/tabs@^3.9.4", "@react-aria/tabs@^3.9.9": version "3.9.9" resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.9.tgz#71d35657062bbfd9d2d31ecedeaf24980e6207c7" integrity sha512-oXPtANs16xu6MdMGLHjGV/2Zupvyp9CJEt7ORPLv5xAzSY5hSjuQHJLZ0te3Lh/KSG5/0o3RW/W5yEqo7pBQQQ== @@ -3198,7 +3217,7 @@ "@react-types/tabs" "^3.3.12" "@swc/helpers" "^0.5.0" -"@react-aria/tag@^3.4.8", "@react-aria/tag@^3.4.9": +"@react-aria/tag@^3.4.4", "@react-aria/tag@^3.4.9": version "3.4.9" resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.4.9.tgz#41987e7fa88c758326071da15a242181d97ec8bb" integrity sha512-Vnps+zk8vYyjevv2Bc6vc9kSp9HFLKrKUDmrWMc0DfseypwJMc3Ya6F965ZVTjF9nuWrojNmvgusNu7qyXFShQ== @@ -3214,7 +3233,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@^3.15.0", "@react-aria/textfield@^3.16.0": +"@react-aria/textfield@^3.14.8", "@react-aria/textfield@^3.16.0": version "3.16.0" resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.16.0.tgz#1a20289e333d4a13db0d59301aaafcc8e010cf3a" integrity sha512-53RVpMeMDN/QoabqnYZ1lxTh1xTQ3IBYQARuayq5EGGMafyxoFHzttxUdSqkZGK/+zdSF2GfmjOYJVm2nDKuDQ== @@ -3242,17 +3261,6 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/toolbar@3.0.0-beta.11": - version "3.0.0-beta.11" - resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.11.tgz#019c9ff2a47ad207504a95afeb0f863cf71a114b" - integrity sha512-LM3jTRFNDgoEpoL568WaiuqiVM7eynSQLJis1hV0vlVnhTd7M7kzt7zoOjzxVb5Uapz02uCp1Fsm4wQMz09qwQ== - dependencies: - "@react-aria/focus" "^3.19.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/utils" "^3.26.0" - "@react-types/shared" "^3.26.0" - "@swc/helpers" "^0.5.0" - "@react-aria/toolbar@3.0.0-beta.12": version "3.0.0-beta.12" resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.12.tgz#b1bf229df637953150be480ac09eec9274c5e75a" @@ -3264,7 +3272,18 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/tooltip@^3.7.10", "@react-aria/tooltip@^3.7.11": +"@react-aria/toolbar@3.0.0-beta.8": + version "3.0.0-beta.8" + resolved "https://registry.yarnpkg.com/@react-aria/toolbar/-/toolbar-3.0.0-beta.8.tgz#2846f22c9c524ec75d577f9edddc4d534cc48fcd" + integrity sha512-nMlA1KK54/Kohb3HlHAzobg69PVIEr8Q1j5P3tLd9apY8FgGvnz7yLpcj6kO1GA872gseEzgiO0Rzk+yRHQRCA== + dependencies: + "@react-aria/focus" "^3.18.2" + "@react-aria/i18n" "^3.12.2" + "@react-aria/utils" "^3.25.2" + "@react-types/shared" "^3.24.1" + "@swc/helpers" "^0.5.0" + +"@react-aria/tooltip@^3.7.11", "@react-aria/tooltip@^3.7.7": version "3.7.11" resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.11.tgz#f02822496e77d7bd5664aeda8670e8428288d7e7" integrity sha512-mhZgAWUj7bUWipDeJXaVPZdqnzoBCd/uaEbdafnvgETmov1udVqPTh9w4ZKX2Oh1wa2+OdLFrBOk+8vC6QbWag== @@ -3277,18 +3296,18 @@ "@react-types/tooltip" "^3.4.14" "@swc/helpers" "^0.5.0" -"@react-aria/tree@3.0.0-beta.2": - version "3.0.0-beta.2" - resolved "https://registry.yarnpkg.com/@react-aria/tree/-/tree-3.0.0-beta.2.tgz#f4edf593e0a5acbc19f2a17d2d78fb0633a105e5" - integrity sha512-lH3hVl2VgG3YLN+ee1zQzm+2F+BGLd/HBhfMYPuI3IjHvDb+m+jCJXHdBOGrfG2Qydk2LYheqX8QXCluulu0qQ== +"@react-aria/tree@3.0.0-alpha.4": + version "3.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@react-aria/tree/-/tree-3.0.0-alpha.4.tgz#b98c170f09d2b5039eba5ddfd6cacad2929076ff" + integrity sha512-a35/clOnkMIF6vLJQWRHJfUzZLAld+XYRZ/vbs+FihZZYgVxgfGT6QKxf4yMPKVx5JKrtkFJ/UCxV+pUPcSyyg== dependencies: - "@react-aria/gridlist" "^3.10.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/selection" "^3.21.0" - "@react-aria/utils" "^3.26.0" - "@react-stately/tree" "^3.8.6" - "@react-types/button" "^3.10.1" - "@react-types/shared" "^3.26.0" + "@react-aria/gridlist" "^3.9.2" + "@react-aria/i18n" "^3.12.2" + "@react-aria/selection" "^3.19.2" + "@react-aria/utils" "^3.25.2" + "@react-stately/tree" "^3.8.4" + "@react-types/button" "^3.9.6" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" "@react-aria/tree@3.0.0-beta.3": @@ -3305,7 +3324,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.26.0", "@react-aria/utils@^3.27.0": +"@react-aria/utils@^3.25.2", "@react-aria/utils@^3.27.0": version "3.27.0" resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.27.0.tgz#92a58177c60055bb007c2e886d2d914f42df2386" integrity sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw== @@ -3316,7 +3335,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/virtualizer@^4.1.0", "@react-aria/virtualizer@^4.1.1": +"@react-aria/virtualizer@^4.0.2", "@react-aria/virtualizer@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@react-aria/virtualizer/-/virtualizer-4.1.1.tgz#54216b13393a55cf7b73577d9cc039033364d6cb" integrity sha512-AYQmC/S9HhxGOj8HkQdxDW8/+sUEmmfcGpjkInzXB8UZCB1FQLC0LpvA8fOP7AfzLaAL+HVcYF5BvnGMPijHTQ== @@ -3328,7 +3347,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-aria/visually-hidden@^3.8.18", "@react-aria/visually-hidden@^3.8.19": +"@react-aria/visually-hidden@^3.8.15", "@react-aria/visually-hidden@^3.8.19": version "3.8.19" resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.19.tgz#4717f6d4333dfa901fa1805c289a025ca0e9dbfc" integrity sha512-MZgCCyQ3sdG94J5iJz7I7Ai3IxoN0U5d/+EaUnA1mfK7jf2fSYQBqi6Eyp8sWUYzBTLw4giXB5h0RGAnWzk9hA== @@ -3485,18 +3504,18 @@ "@react-stately/utils" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.6.0.tgz#c770890160c33826206a015eb7da32fe8ece81d5" - integrity sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA== +"@react-stately/calendar@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.5.4.tgz#847b2a2e5cf13a81b3344f1ef4e9a0d10138191e" + integrity sha512-R2011mtFSXIjzMXaA+CZ1sflPm9XkTBMqVk77Bnxso2ZsG7FUX8nqFmaDavxwTuHFC6OUexAGSMs8bP9KycTNg== dependencies: - "@internationalized/date" "^3.6.0" - "@react-stately/utils" "^3.10.5" - "@react-types/calendar" "^3.5.0" - "@react-types/shared" "^3.26.0" + "@internationalized/date" "^3.5.5" + "@react-stately/utils" "^3.10.3" + "@react-types/calendar" "^3.4.9" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@^3.6.0", "@react-stately/calendar@^3.7.0": +"@react-stately/calendar@^3.5.4", "@react-stately/calendar@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.7.0.tgz#2c1391173a077734f74e1e27cab6da333ca1d0e5" integrity sha512-N15zKubP2S7eWfPSJjKVlmJA7YpWzrIGx52BFhwLSQAZcV+OPcMgvOs71WtB7PLwl6DUYQGsgc0B3tcHzzvdvQ== @@ -3507,7 +3526,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@^3.6.10", "@react-stately/checkbox@^3.6.11": +"@react-stately/checkbox@^3.6.11", "@react-stately/checkbox@^3.6.8": version "3.6.11" resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.11.tgz#91cead7b40a8aa6e198a7191d2ffeb1cdc59054a" integrity sha512-jApdBis+Q1sXLivg+f7krcVaP/AMMMiQcVqcz5gwxlweQN+dRZ/NpL0BYaDOuGc26Mp0lcuVaET3jIZeHwtyxA== @@ -3518,7 +3537,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/collections@^3.12.0", "@react-stately/collections@^3.12.1": +"@react-stately/collections@^3.10.9", "@react-stately/collections@^3.12.1": version "3.12.1" resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.1.tgz#3a0af2555f95c339706a68e51b8f828df5d9ee7f" integrity sha512-8QmFBL7f+P64dEP4o35pYH61/lP0T/ziSdZAvNMrCqaM+fXcMfUp2yu1E63kADVX7WRDsFJWE3CVMeqirPH6Xg== @@ -3526,7 +3545,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/color@^3.8.1", "@react-stately/color@^3.8.2": +"@react-stately/color@^3.7.2", "@react-stately/color@^3.8.2": version "3.8.2" resolved "https://registry.yarnpkg.com/@react-stately/color/-/color-3.8.2.tgz#7d542d1e45d8fe2f9d590c67d8cfea4315d8002a" integrity sha512-GXwLmv1Eos2OwOiRsGFrXBKx8+uZh2q0qzLZEVYrWsedNhIdTm7nnpwO68nCYZPHkqhv6rhhVSlOOFmDLY++ow== @@ -3541,7 +3560,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@^3.10.1", "@react-stately/combobox@^3.10.2": +"@react-stately/combobox@^3.10.2", "@react-stately/combobox@^3.9.2": version "3.10.2" resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.2.tgz#2a6d861d7464f62d82e5f1859bb15e981fd0b0e9" integrity sha512-uT642Dool4tQBh+8UQjlJnTisrJVtg3LqmiP/HqLQ4O3pW0O+ImbG+2r6c9dUzlAnH4kEfmEwCp9dxkBkmFWsg== @@ -3556,7 +3575,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/data@^3.12.0", "@react-stately/data@^3.12.1": +"@react-stately/data@^3.11.6", "@react-stately/data@^3.12.1": version "3.12.1" resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.12.1.tgz#d1f3a9e8a80d882d0987f6b99f2a2b37db11a945" integrity sha512-/Nc8X1FmrJ53QU4rN/1i1JtNir4iqo+39Xn5ZOJ74Nng7T+xVVuEuWSo+OEGaycCJf2eZRsomauPxUnnZgCM1A== @@ -3564,21 +3583,21 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@3.11.0": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.11.0.tgz#5f4daff449f756dc40b4201ae337dd4a3f29facc" - integrity sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg== +"@react-stately/datepicker@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.10.2.tgz#2023e5cfc71240e8557720f1c3dfbe03207083bf" + integrity sha512-pa5IZUw+49AyOnddwu4XwU2kI5eo/1thbiIVNHP8uDpbbBrBkquSk3zVFDAGX1cu/I1U2VUkt64U/dxgkwaMQw== dependencies: - "@internationalized/date" "^3.6.0" - "@internationalized/string" "^3.2.5" - "@react-stately/form" "^3.1.0" - "@react-stately/overlays" "^3.6.12" - "@react-stately/utils" "^3.10.5" - "@react-types/datepicker" "^3.9.0" - "@react-types/shared" "^3.26.0" + "@internationalized/date" "^3.5.5" + "@internationalized/string" "^3.2.3" + "@react-stately/form" "^3.0.5" + "@react-stately/overlays" "^3.6.10" + "@react-stately/utils" "^3.10.3" + "@react-types/datepicker" "^3.8.2" + "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@^3.11.0", "@react-stately/datepicker@^3.12.0": +"@react-stately/datepicker@^3.10.2", "@react-stately/datepicker@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.12.0.tgz#c9e5d0694a4d8bf0dbb3e795b81dfa0eb5f1e7a2" integrity sha512-AfJEP36d+QgQ30GfacXtYdGsJvqY2yuCJ+JrjHct+m1nYuTkMvMMnhwNBFasgDJPLCDyHzyANlWkl2kQGfsBFw== @@ -3592,7 +3611,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/disclosure@^3.0.0", "@react-stately/disclosure@^3.0.1": +"@react-stately/disclosure@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@react-stately/disclosure/-/disclosure-3.0.1.tgz#ea79036cb08e854020856b77be81e3abd99b0700" integrity sha512-afpNy5b0UcqRGjU/W5OD0xkx4PbymvhMrgQZ4o4OdtDVMMvr9T5UqMF8/j3J591DxgQfXM872tJu0kotqT0L6Q== @@ -3601,7 +3620,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/dnd@^3.5.0", "@react-stately/dnd@^3.5.1": +"@react-stately/dnd@^3.4.2", "@react-stately/dnd@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.5.1.tgz#fb2483df0abdb34352a06e36d199c016f315977d" integrity sha512-N18wt6fka9ngJJqxfAzmdtyrk9whAnqWUxZn22CatjNQsqukI4a6KRYwZTXM9x/wm7KamhVOp+GBl85zM8GLdA== @@ -3617,7 +3636,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@^3.1.0", "@react-stately/form@^3.1.1": +"@react-stately/form@^3.0.5", "@react-stately/form@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.1.tgz#46980c7b64a785497936a379a67c0dfa8f3c76f7" integrity sha512-qavrz5X5Mdf/Q1v/QJRxc0F8UTNEyRCNSM1we/nnF7GV64+aYSDLOtaRGmzq+09RSwo1c8ZYnIkK5CnwsPhTsQ== @@ -3636,7 +3655,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/layout@^4.1.0", "@react-stately/layout@^4.1.1": +"@react-stately/layout@^4.0.2", "@react-stately/layout@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-4.1.1.tgz#26e718ad9c1c102ba7d40ceff7ce67264adbf3d5" integrity sha512-kXeo7HKYTOcqMKru1sKFoMoZA+YywSUqHeIA90MptzRugbFhQGq4nUbIYM2p3FeHAX9HU1JAXThuLcwDOHhB8Q== @@ -3649,7 +3668,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.11.1", "@react-stately/list@^3.11.2": +"@react-stately/list@^3.10.8", "@react-stately/list@^3.11.2": version "3.11.2" resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.2.tgz#11f1002707dfb54af391a24ca8ef063b6a8cde26" integrity sha512-eU2tY3aWj0SEeC7lH9AQoeAB4LL9mwS54FvTgHHoOgc1ZIwRJUaZoiuETyWQe98AL8KMgR1nrnDJ1I+CcT1Y7g== @@ -3660,7 +3679,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.9.0", "@react-stately/menu@^3.9.1": +"@react-stately/menu@^3.8.2", "@react-stately/menu@^3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.1.tgz#fc01957ed8e01e7d85c0b6bd21bc8087b4df59f3" integrity sha512-WRjGGImhQlQaer/hhahGytwd1BDq3fjpTkY/04wv3cQJPJR6lkVI5nSvGFMHfCaErsA1bNyB8/T9Y5F5u4u9ng== @@ -3670,7 +3689,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/numberfield@^3.9.8", "@react-stately/numberfield@^3.9.9": +"@react-stately/numberfield@^3.9.6", "@react-stately/numberfield@^3.9.9": version "3.9.9" resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.9.9.tgz#a7d2d756aee8dd2df0eb1b0c1ab657148de4a439" integrity sha512-hZsLiGGHTHmffjFymbH1qVmA633rU2GNjMFQTuSsN4lqqaP8fgxngd5pPCoTCUFEkUgWjdHenw+ZFByw8lIE+g== @@ -3681,7 +3700,7 @@ "@react-types/numberfield" "^3.8.8" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.6.12", "@react-stately/overlays@^3.6.13": +"@react-stately/overlays@^3.6.10", "@react-stately/overlays@^3.6.13": version "3.6.13" resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.13.tgz#37cd757d3404d0fb827216a8e11dbce8ea2186c7" integrity sha512-WsU85Gf/b+HbWsnnYw7P/Ila3wD+C37Uk/WbU4/fHgJ26IEOWsPE6wlul8j54NZ1PnLNhV9Fn+Kffi+PaJMQXQ== @@ -3690,7 +3709,7 @@ "@react-types/overlays" "^3.8.12" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.10.10", "@react-stately/radio@^3.10.9": +"@react-stately/radio@^3.10.10", "@react-stately/radio@^3.10.7": version "3.10.10" resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.10.tgz#1507265e66ce2d200f0d2127f1659ba0d7f53fba" integrity sha512-9x3bpq87uV8iYA4NaioTTWjriQSlSdp+Huqlxll0T3W3okpyraTTejE91PbIoRTUmL5qByIh2WzxYmr4QdBgAA== @@ -3701,7 +3720,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/searchfield@^3.5.8", "@react-stately/searchfield@^3.5.9": +"@react-stately/searchfield@^3.5.6", "@react-stately/searchfield@^3.5.9": version "3.5.9" resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.5.9.tgz#0e552c1928b9affb6dfd6de280c2d9aca8486b73" integrity sha512-7/aO/oLJ4czKEji0taI/lbHKqPJRag9p3YmRaZ4yqjIMpKxzmJCWQcov5lzWeFhG/1hINKndYlxFnVIKV/urpg== @@ -3710,7 +3729,7 @@ "@react-types/searchfield" "^3.5.11" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.6.10", "@react-stately/select@^3.6.9": +"@react-stately/select@^3.6.10", "@react-stately/select@^3.6.7": version "3.6.10" resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.10.tgz#ecfb1fb286f810c05cdd6b5050869ac42316ad03" integrity sha512-V7V0FCL9T+GzLjyfnJB6PUaKldFyT/8Rj6M+R9ura1A0O+s/FEOesy0pdMXFoL1l5zeUpGlCnhJrsI5HFWHfDw== @@ -3722,7 +3741,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/selection@^3.18.0", "@react-stately/selection@^3.19.0": +"@react-stately/selection@^3.16.2", "@react-stately/selection@^3.19.0": version "3.19.0" resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.19.0.tgz#e81357d94330c06bfc3a842f454be93c5c089b28" integrity sha512-AvbUqnWjqVQC48RD39S9BpMKMLl55Zo5l/yx5JQFPl55cFwe9Tpku1KY0wzt3fXXiXWaqjDn/7Gkg1VJYy8esQ== @@ -3732,7 +3751,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.6.0", "@react-stately/slider@^3.6.1": +"@react-stately/slider@^3.5.7", "@react-stately/slider@^3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.1.tgz#2e410dd8232aaf74f384616c5af70f375514662c" integrity sha512-8kij5O82Xe233vZZ6qNGqPXidnlNQiSnyF1q613c7ktFmzAyGjkIWVUapHi23T1fqm7H2Rs3RWlmwE9bo2KecA== @@ -3742,7 +3761,7 @@ "@react-types/slider" "^3.7.8" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.13.0", "@react-stately/table@^3.13.1": +"@react-stately/table@^3.12.2", "@react-stately/table@^3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.13.1.tgz#dd621097b0c1e74e60509491d960f5d63ada0bf4" integrity sha512-Im8W+F8o9EhglY5kqRa3xcMGXl8zBi6W5phGpAjXb+UGDL1tBIlAcYj733bw8g/ITCnaSz9ubsmON0HekPd6Jg== @@ -3757,7 +3776,7 @@ "@react-types/table" "^3.10.4" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.7.0", "@react-stately/tabs@^3.7.1": +"@react-stately/tabs@^3.6.9", "@react-stately/tabs@^3.7.1": version "3.7.1" resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.7.1.tgz#342fac307357c277e9a6e17dba077ea784b8ace2" integrity sha512-gr9ACyuWrYuc727h7WaHdmNw8yxVlUyQlguziR94MdeRtFGQnf3V6fNQG3kxyB77Ljko69tgDF7Nf6kfPUPAQQ== @@ -3767,7 +3786,7 @@ "@react-types/tabs" "^3.3.12" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.8.0", "@react-stately/toggle@^3.8.1": +"@react-stately/toggle@^3.7.7", "@react-stately/toggle@^3.8.1": version "3.8.1" resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.1.tgz#3ab375d910f417a57bf457dfb0f1e0dd14d2e7f8" integrity sha512-MVpe79ghVQiwLmVzIPhF/O/UJAUc9B+ZSylVTyJiEPi0cwhbkKGQv9thOF0ebkkRkace5lojASqUAYtSTZHQJA== @@ -3777,7 +3796,7 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.5.0", "@react-stately/tooltip@^3.5.1": +"@react-stately/tooltip@^3.4.12", "@react-stately/tooltip@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.5.1.tgz#b002cdd7e652c3deaae48daa736f74ad7040f2d4" integrity sha512-0aI3U5kB7Cop9OCW9/Bag04zkivFSdUcQgy/TWL4JtpXidVWmOha8txI1WySawFSjZhH83KIyPc+wKm1msfLMQ== @@ -3786,7 +3805,7 @@ "@react-types/tooltip" "^3.4.14" "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.8.6", "@react-stately/tree@^3.8.7": +"@react-stately/tree@^3.8.4", "@react-stately/tree@^3.8.7": version "3.8.7" resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.7.tgz#4eb80212d9dd7c1522d65a14dc039818da690891" integrity sha512-hpc3pyuXWeQV5ufQ02AeNQg/MYhnzZ4NOznlY5OOUoPzpLYiI3ZJubiY3Dot4jw5N/LR7CqvDLHmrHaJPmZlHg== @@ -3797,14 +3816,14 @@ "@react-types/shared" "^3.27.0" "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.10.4", "@react-stately/utils@^3.10.5": +"@react-stately/utils@^3.10.3", "@react-stately/utils@^3.10.4", "@react-stately/utils@^3.10.5": version "3.10.5" resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.5.tgz#47bb91cd5afd1bafe39353614e5e281b818ebccc" integrity sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ== dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^4.2.0", "@react-stately/virtualizer@^4.2.1": +"@react-stately/virtualizer@^4.0.2", "@react-stately/virtualizer@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-4.2.1.tgz#da001c17794ba171c414be44ce95918e3a5fe085" integrity sha512-GHGEXV0ZRhq34U/P3LzkByCBfy2IDynYlV1SE4njkUWWGE/0AH56UegM6w2l3GeiNpXsXCgXl7jpAKeIGMEnrQ== @@ -3830,14 +3849,14 @@ "@react-types/link" "^3.5.10" "@react-types/shared" "^3.27.0" -"@react-types/button@^3.10.1", "@react-types/button@^3.10.2": +"@react-types/button@^3.10.2", "@react-types/button@^3.9.6": version "3.10.2" resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.2.tgz#60ce0d4a16690d94a8ae23bb00207c8af9616919" integrity sha512-h8SB/BLoCgoBulCpyzaoZ+miKXrolK9XC48+n1dKJXT8g4gImrficurDW6+PRTQWaRai0Q0A6bu8UibZOU4syg== dependencies: "@react-types/shared" "^3.27.0" -"@react-types/calendar@^3.5.0", "@react-types/calendar@^3.6.0": +"@react-types/calendar@^3.4.9", "@react-types/calendar@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.6.0.tgz#4cfaa261cce621b77ef0705d0f9c07da774a007b" integrity sha512-BtFh4BFwvsYlsaSqUOVxlqXZSlJ6u4aozgO3PwHykhpemwidlzNwm9qDZhcMWPioNF/w2cU/6EqhvEKUHDnFZg== @@ -3852,7 +3871,15 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/color@^3.0.1", "@react-types/color@^3.0.2": +"@react-types/color@3.0.0-rc.1": + version "3.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.0-rc.1.tgz#d7503ae76b0abea07af35926aa0d15e7721dd54c" + integrity sha512-aw6FzrBlZTWKrFaFskM7e3AFICe6JqH10wO0E919goa3LZDDFbyYEwRpatwjIyiZH1elEUkFPgwqpv3ZcPPn8g== + dependencies: + "@react-types/shared" "^3.24.1" + "@react-types/slider" "^3.7.5" + +"@react-types/color@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@react-types/color/-/color-3.0.2.tgz#e8a1a3be5689e3c128d50a4d30f5bbb2d46d88e9" integrity sha512-4k9c0l5SACwTtkHV0dQ0GrF0Kktk/NChkxtyu58BamyUQOsCe8sqny+uul2nPrqQvuVof/dkRjKhv/DVyyx2mw== @@ -3867,7 +3894,7 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/datepicker@^3.10.0", "@react-types/datepicker@^3.9.0": +"@react-types/datepicker@^3.10.0", "@react-types/datepicker@^3.8.2": version "3.10.0" resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.10.0.tgz#4557c2d22a52fb7340ca27e6eba4d23556684e84" integrity sha512-Att7y4NedNH1CogMDIX9URXgMLxGbZgnFCZ8oxgFAVndWzbh3TBcc4s7uoJDPvgRMAalq+z+SrlFFeoBeJmvvg== @@ -3877,7 +3904,7 @@ "@react-types/overlays" "^3.8.12" "@react-types/shared" "^3.27.0" -"@react-types/dialog@^3.5.14", "@react-types/dialog@^3.5.15": +"@react-types/dialog@^3.5.12", "@react-types/dialog@^3.5.15": version "3.5.15" resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.15.tgz#abf7c16c41808b80ac7300f9dc4a8a1ba72020ee" integrity sha512-BX1+mV35Oa0aIlhu98OzJaSB7uiCWDPQbr0AkpFBajSSlESUoAjntN+4N+QJmj24z2v6UE9zxGQ85/U/0Le+bw== @@ -3885,14 +3912,14 @@ "@react-types/overlays" "^3.8.12" "@react-types/shared" "^3.27.0" -"@react-types/form@^3.7.8", "@react-types/form@^3.7.9": +"@react-types/form@^3.7.6", "@react-types/form@^3.7.9": version "3.7.9" resolved "https://registry.yarnpkg.com/@react-types/form/-/form-3.7.9.tgz#e2676c7edf66f71f1dfa676ce95e4fc8aab5a049" integrity sha512-+qGDrQFdIh8umU82zmnYJ0V2rLoGSQ3yApFT02URz//NWeTA7qo0Oab2veKvXUkcBb47oSvytZYmkExPikxIEg== dependencies: "@react-types/shared" "^3.27.0" -"@react-types/grid@^3.2.10", "@react-types/grid@^3.2.11": +"@react-types/grid@^3.2.11", "@react-types/grid@^3.2.8": version "3.2.11" resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.11.tgz#0609807fde54356e3ff99a3b6df5859afed5e517" integrity sha512-Mww9nrasppvPbsBi+uUqFnf7ya8fXN0cTVzDNG+SveD8mhW+sbtuy+gPtEpnFD2Oyi8qLuObefzt4gdekJX2Yw== @@ -3971,12 +3998,12 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/shared@^3.26.0", "@react-types/shared@^3.27.0": +"@react-types/shared@^3.24.1", "@react-types/shared@^3.27.0": version "3.27.0" resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.27.0.tgz#167c163139efc98c2194aba090076c03b658c07d" integrity sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw== -"@react-types/slider@^3.7.8": +"@react-types/slider@^3.7.5", "@react-types/slider@^3.7.8": version "3.7.8" resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.8.tgz#a844b81a67171931352d3b5fb40ae87290b99097" integrity sha512-utW1o9KT70hqFwu1zqMtyEWmP0kSATk4yx+Fm/peSR4iZa+BasRqH83yzir5GKc8OfqfE1kmEsSlO98/k986+w== @@ -3990,7 +4017,7 @@ dependencies: "@react-types/shared" "^3.27.0" -"@react-types/table@^3.10.3", "@react-types/table@^3.10.4": +"@react-types/table@^3.10.1", "@react-types/table@^3.10.4": version "3.10.4" resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.4.tgz#1ad302f78625c864bc8fd7fa95d839e50efdec15" integrity sha512-d0tLz/whxVteqr1rophtuuxqyknHHfTKeXrCgDjt8pAyd9U8GPDbfcFSfYPUhWdELRt7aLVyQw6VblZHioVEgQ== @@ -4559,17 +4586,17 @@ dependencies: "@tanstack/query-core" "5.65.0" -"@tanstack/react-table@8.20.6": - version "8.20.6" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.20.6.tgz#a1f3103327aa59aa621931f4087a7604a21054d0" - integrity sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ== +"@tanstack/react-table@8.20.1": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.20.1.tgz#bd2d549d8a18458fb8284025ce66a9b86176fa6b" + integrity sha512-PJK+07qbengObe5l7c8vCdtefXm8cyR4i078acWrHbdm8JKw1ES7YpmOtVt9ALUVEEFAHscdVpGRhRgikgFMbQ== dependencies: - "@tanstack/table-core" "8.20.5" + "@tanstack/table-core" "8.20.1" -"@tanstack/table-core@8.20.5": - version "8.20.5" - resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.5.tgz#3974f0b090bed11243d4107283824167a395cf1d" - integrity sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg== +"@tanstack/table-core@8.20.1": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.1.tgz#74bfab10fa35bed51fa0bd2f3539a331d7e78f1b" + integrity sha512-5Ly5TIRHnWH7vSDell9B/OVyV380qqIJVg7H7R7jU4fPEmOD4smqAX7VRflpYI09srWR8aj5OLD2Ccs1pI5mTg== "@testing-library/dom@10.4.0": version "10.4.0" @@ -6243,10 +6270,10 @@ chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chromatic@11.22.0: - version "11.22.0" - resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.22.0.tgz#9c2b05a0c5a94c5c0cc2b6be6969c112ac4543d0" - integrity sha512-u1kAPR9lj9aFzsCp0iWPXBbsKgcxFU7iJO6mFbgNHGVg+YPBqiJMuvgB8EQHdNbHjk5amFnGnIz/Ww8fK3t9Hw== +chromatic@11.7.1: + version "11.7.1" + resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.7.1.tgz#9de59dd9d0e2a847627bccd959f05881335b524e" + integrity sha512-LvgPimdQdnQB07ZDxLEC2KtxgYeqTw0X71GA7fi3zhgtKLxZcE+BSZ/5I9rrQp1V8ydmfElfw0ZwnUH4fVgUAQ== chrome-trace-event@^1.0.2: version "1.0.4" @@ -11632,42 +11659,38 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-aria-components@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.5.0.tgz#9c51ba8427e827d1192f965249e16ff7d34cbb55" - integrity sha512-wzf0g6cvWrqAJd4FkisAfFnslx6AJREgOd/NEmVE/RGuDxGTzss4awcwbo98rIVmqbTTFApiygy0SyWGrRZfDA== +react-aria-components@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/react-aria-components/-/react-aria-components-1.3.2.tgz#dee58665210330ec12843e6393ef5cc28ff9a9da" + integrity sha512-jAHR18ubLi4R6mUgSVpPfPGNNfwrveJ7IZ9ns8prUkXpY/A8IkR5x8y1SbXJKq9uwlGC2cEiWjG6OMAsmAAXdQ== dependencies: - "@internationalized/date" "^3.6.0" - "@internationalized/string" "^3.2.5" - "@react-aria/collections" "3.0.0-alpha.6" - "@react-aria/color" "^3.0.2" - "@react-aria/disclosure" "^3.0.0" - "@react-aria/dnd" "^3.8.0" - "@react-aria/focus" "^3.19.0" - "@react-aria/interactions" "^3.22.5" - "@react-aria/live-announcer" "^3.4.1" - "@react-aria/menu" "^3.16.0" - "@react-aria/toolbar" "3.0.0-beta.11" - "@react-aria/tree" "3.0.0-beta.2" - "@react-aria/utils" "^3.26.0" - "@react-aria/virtualizer" "^4.1.0" - "@react-stately/color" "^3.8.1" - "@react-stately/disclosure" "^3.0.0" - "@react-stately/layout" "^4.1.0" - "@react-stately/menu" "^3.9.0" - "@react-stately/selection" "^3.18.0" - "@react-stately/table" "^3.13.0" - "@react-stately/utils" "^3.10.5" - "@react-stately/virtualizer" "^4.2.0" - "@react-types/color" "^3.0.1" - "@react-types/form" "^3.7.8" - "@react-types/grid" "^3.2.10" - "@react-types/shared" "^3.26.0" - "@react-types/table" "^3.10.3" + "@internationalized/date" "^3.5.5" + "@internationalized/string" "^3.2.3" + "@react-aria/collections" "3.0.0-alpha.4" + "@react-aria/color" "3.0.0-rc.2" + "@react-aria/dnd" "^3.7.2" + "@react-aria/focus" "^3.18.2" + "@react-aria/interactions" "^3.22.2" + "@react-aria/menu" "^3.15.2" + "@react-aria/toolbar" "3.0.0-beta.8" + "@react-aria/tree" "3.0.0-alpha.4" + "@react-aria/utils" "^3.25.2" + "@react-aria/virtualizer" "^4.0.2" + "@react-stately/color" "^3.7.2" + "@react-stately/layout" "^4.0.2" + "@react-stately/menu" "^3.8.2" + "@react-stately/table" "^3.12.2" + "@react-stately/utils" "^3.10.3" + "@react-stately/virtualizer" "^4.0.2" + "@react-types/color" "3.0.0-rc.1" + "@react-types/form" "^3.7.6" + "@react-types/grid" "^3.2.8" + "@react-types/shared" "^3.24.1" + "@react-types/table" "^3.10.1" "@swc/helpers" "^0.5.0" client-only "^0.0.1" - react-aria "^3.36.0" - react-stately "^3.34.0" + react-aria "^3.34.2" + react-stately "^3.32.2" use-sync-external-store "^1.2.0" react-aria-components@1.6.0: @@ -11710,52 +11733,50 @@ react-aria-components@1.6.0: react-stately "^3.35.0" use-sync-external-store "^1.2.0" -react-aria@3.36.0: - version "3.36.0" - resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.36.0.tgz#95a8e3340ab400bfec4d159e47da8861469e5bcd" - integrity sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw== +react-aria@3.34.2: + version "3.34.2" + resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.34.2.tgz#7d00dd445d2bedcc4d68aea9aa5ecffe04066aa3" + integrity sha512-V5xvIw/nW6ED8mEdNIao7+z8gKMSff0HAiU7mshh1ZDI0LGyOM6JR/qQmux0mUOxbBARtNiBbBV6pwmQGkfQDw== dependencies: - "@internationalized/string" "^3.2.5" - "@react-aria/breadcrumbs" "^3.5.19" - "@react-aria/button" "^3.11.0" - "@react-aria/calendar" "^3.6.0" - "@react-aria/checkbox" "^3.15.0" - "@react-aria/color" "^3.0.2" - "@react-aria/combobox" "^3.11.0" - "@react-aria/datepicker" "^3.12.0" - "@react-aria/dialog" "^3.5.20" - "@react-aria/disclosure" "^3.0.0" - "@react-aria/dnd" "^3.8.0" - "@react-aria/focus" "^3.19.0" - "@react-aria/gridlist" "^3.10.0" - "@react-aria/i18n" "^3.12.4" - "@react-aria/interactions" "^3.22.5" - "@react-aria/label" "^3.7.13" - "@react-aria/link" "^3.7.7" - "@react-aria/listbox" "^3.13.6" - "@react-aria/menu" "^3.16.0" - "@react-aria/meter" "^3.4.18" - "@react-aria/numberfield" "^3.11.9" - "@react-aria/overlays" "^3.24.0" - "@react-aria/progress" "^3.4.18" - "@react-aria/radio" "^3.10.10" - "@react-aria/searchfield" "^3.7.11" - "@react-aria/select" "^3.15.0" - "@react-aria/selection" "^3.21.0" - "@react-aria/separator" "^3.4.4" - "@react-aria/slider" "^3.7.14" - "@react-aria/ssr" "^3.9.7" - "@react-aria/switch" "^3.6.10" - "@react-aria/table" "^3.16.0" - "@react-aria/tabs" "^3.9.8" - "@react-aria/tag" "^3.4.8" - "@react-aria/textfield" "^3.15.0" - "@react-aria/tooltip" "^3.7.10" - "@react-aria/utils" "^3.26.0" - "@react-aria/visually-hidden" "^3.8.18" - "@react-types/shared" "^3.26.0" + "@internationalized/string" "^3.2.3" + "@react-aria/breadcrumbs" "^3.5.16" + "@react-aria/button" "^3.9.8" + "@react-aria/calendar" "^3.5.11" + "@react-aria/checkbox" "^3.14.6" + "@react-aria/combobox" "^3.10.2" + "@react-aria/datepicker" "^3.11.2" + "@react-aria/dialog" "^3.5.17" + "@react-aria/dnd" "^3.7.2" + "@react-aria/focus" "^3.18.2" + "@react-aria/gridlist" "^3.9.2" + "@react-aria/i18n" "^3.12.2" + "@react-aria/interactions" "^3.22.2" + "@react-aria/label" "^3.7.11" + "@react-aria/link" "^3.7.4" + "@react-aria/listbox" "^3.13.2" + "@react-aria/menu" "^3.15.2" + "@react-aria/meter" "^3.4.16" + "@react-aria/numberfield" "^3.11.6" + "@react-aria/overlays" "^3.23.2" + "@react-aria/progress" "^3.4.16" + "@react-aria/radio" "^3.10.7" + "@react-aria/searchfield" "^3.7.8" + "@react-aria/select" "^3.14.8" + "@react-aria/selection" "^3.19.2" + "@react-aria/separator" "^3.4.2" + "@react-aria/slider" "^3.7.11" + "@react-aria/ssr" "^3.9.5" + "@react-aria/switch" "^3.6.7" + "@react-aria/table" "^3.15.2" + "@react-aria/tabs" "^3.9.4" + "@react-aria/tag" "^3.4.4" + "@react-aria/textfield" "^3.14.8" + "@react-aria/tooltip" "^3.7.7" + "@react-aria/utils" "^3.25.2" + "@react-aria/visually-hidden" "^3.8.15" + "@react-types/shared" "^3.24.1" -react-aria@^3.36.0, react-aria@^3.37.0: +react-aria@^3.34.2, react-aria@^3.37.0: version "3.37.0" resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.37.0.tgz#c561d605b19fe89e4056f98990486d17a56c5352" integrity sha512-u3WUEMTcbQFaoHauHO3KhPaBYzEv1o42EdPcLAs05GBw9Q6Axlqwo73UFgMrsc2ElwLAZ4EKpSdWHLo1R5gfiw== @@ -11800,7 +11821,7 @@ react-aria@^3.36.0, react-aria@^3.37.0: "@react-aria/visually-hidden" "^3.8.19" "@react-types/shared" "^3.27.0" -react-dom@*, react-dom@18.3.1, react-dom@19.0.0: +react-dom@*, react-dom@18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -11851,10 +11872,10 @@ react-lifecycles-compat@^3.0.0: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-modal@3.16.3: - version "3.16.3" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.3.tgz#c412d41915782e3c261253435d01468e2439b11b" - integrity sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw== +react-modal@3.16.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" + integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== dependencies: exenv "^1.2.0" prop-types "^15.7.2" @@ -11900,38 +11921,36 @@ react-select@5.10.0: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.2.0" -react-stately@3.34.0: - version "3.34.0" - resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.34.0.tgz#981713fa00bb2ef07b981dbce466d9a5774101d4" - integrity sha512-0N9tZ8qQ/CxpJH7ao0O6gr+8955e7VrOskg9N+TIxkFknPetwOCtgppMYhnTfteBV8WfM/vv4OC1NbkgYTqXJA== +react-stately@3.32.2: + version "3.32.2" + resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.32.2.tgz#72f2cdb890327f62738388a7d311ed356bfde41d" + integrity sha512-pDSrbCIJtir4HeSa//PTqLSR7Tl7pFC9usmkkBObNKktObQq3Vdgkf46cxeTD1ov7J7GDdR3meIyjXGnZoEzUg== dependencies: - "@react-stately/calendar" "^3.6.0" - "@react-stately/checkbox" "^3.6.10" - "@react-stately/collections" "^3.12.0" - "@react-stately/color" "^3.8.1" - "@react-stately/combobox" "^3.10.1" - "@react-stately/data" "^3.12.0" - "@react-stately/datepicker" "^3.11.0" - "@react-stately/disclosure" "^3.0.0" - "@react-stately/dnd" "^3.5.0" - "@react-stately/form" "^3.1.0" - "@react-stately/list" "^3.11.1" - "@react-stately/menu" "^3.9.0" - "@react-stately/numberfield" "^3.9.8" - "@react-stately/overlays" "^3.6.12" - "@react-stately/radio" "^3.10.9" - "@react-stately/searchfield" "^3.5.8" - "@react-stately/select" "^3.6.9" - "@react-stately/selection" "^3.18.0" - "@react-stately/slider" "^3.6.0" - "@react-stately/table" "^3.13.0" - "@react-stately/tabs" "^3.7.0" - "@react-stately/toggle" "^3.8.0" - "@react-stately/tooltip" "^3.5.0" - "@react-stately/tree" "^3.8.6" - "@react-types/shared" "^3.26.0" + "@react-stately/calendar" "^3.5.4" + "@react-stately/checkbox" "^3.6.8" + "@react-stately/collections" "^3.10.9" + "@react-stately/combobox" "^3.9.2" + "@react-stately/data" "^3.11.6" + "@react-stately/datepicker" "^3.10.2" + "@react-stately/dnd" "^3.4.2" + "@react-stately/form" "^3.0.5" + "@react-stately/list" "^3.10.8" + "@react-stately/menu" "^3.8.2" + "@react-stately/numberfield" "^3.9.6" + "@react-stately/overlays" "^3.6.10" + "@react-stately/radio" "^3.10.7" + "@react-stately/searchfield" "^3.5.6" + "@react-stately/select" "^3.6.7" + "@react-stately/selection" "^3.16.2" + "@react-stately/slider" "^3.5.7" + "@react-stately/table" "^3.12.2" + "@react-stately/tabs" "^3.6.9" + "@react-stately/toggle" "^3.7.7" + "@react-stately/tooltip" "^3.4.12" + "@react-stately/tree" "^3.8.4" + "@react-types/shared" "^3.24.1" -react-stately@^3.34.0, react-stately@^3.35.0: +react-stately@^3.32.2, react-stately@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.35.0.tgz#92bfc83bb4f7626a57c6aeabe4d08aeaab1fa2f7" integrity sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA== @@ -11989,7 +12008,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, react@18.3.1, react@19.0.0: +react@*, react@18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==